題目描述
珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練,既能夠開發智力,又能夠爲日常生活帶來很多便利,因而在很多學校得到普及。
某學校的珠心算老師採用一種快速考察珠心算加法能力的測驗方法。他隨機生成一個正整數集合,集合中的數各不相同,然後要求學生回答:其中有多少個數,恰好等於集合中另外兩個(不同的)數之和?
最近老師出了一些測驗題,請你幫忙求出答案。
(本題目爲2014NOIP普及T1)
輸入格式
共兩行,第一行包含一個整數n,表示測試題中給出的正整數個數。
第二行有n個正整數,每兩個正整數之間用一個空格隔開,表示測試題中給出的正整數。
輸出格式
一個整數,表示測驗題答案。
輸入輸出樣例
輸入 #1
4
1 2 3 4
輸出 #1
2
說明/提示
【樣例說明】
由 1+2=3,1+3=4,故滿足測試要求的答案爲22。
注意,加數和被加數必須是集合中的兩個不同的數。
【數據說明】
對於100%的數據,3≤n≤100,測驗題給出的正整數大小不超過10,000。
題目大意: 就是在給定的一組數據中判斷有多少個數的值可以用所給的數據相加得到。
分析:本體直接用暴力枚舉,依次計算每兩個數相加的結果,然後再所給數據中去查找;做本題的時候可以先對數據進行排序,可以避免大量重複計算和循環判斷。
代碼:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n]; //存放輸入的數組;
set <int> sum; //存放滿足條件的數字;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
sort(a,a+n);
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
int k;
while(a[i]==a[j]) j++;
int s = a[i]+a[j];
if(s>a[n-1]) break;
if(i<j) k=j;
else k=i;
for(;k<n;k++)
{
if(s==a[k])
{
sum.insert(s);
//cout << a[i] << "+" << a[j] << "=" << a[k] << endl;
}
}
}
}
cout << sum.size() <<endl;
}