【题目描述】
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
【输入】
输入共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。
第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
【输出】
输出共一行,包含一个整数,表示测验题答案。
【输入样例】
4
1 2 3 4
【输出样例】
2
【提示】
【样例说明】
由 1+2=3,1+3=4,故满足测试要求的答案为 2。注意,加数和被加数必须是集合中的
两个不同的数。
【数据说明】
对于 100%的数据,3 ≤ n ≤ 100,测验题给出的正整数大小不超过 10,000。
[解题思路]
这道题的话直接把所有情况都列出来应该是不会TLE的这里我们讲另外一个方法.
我们可以创建一个数组b[],用于保存是否输入中是否有这个数.然后将输入的数进行从小到大排序
当我们在求一个值是否可以等于两数只和时(如9,在数组第k个的位置),在前面的数:k-1,k-2,k-3......进行查找,假设第k-1个为5,那么判断b[9-5]是否出现过,如果出现过就代表可以.
[参考代码]
#include<bits/stdc++.h>
using namespace std;
int a[101];
bool b[10000];
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]),b[a[i]]=true;
sort(a+1,a+1+n);
int sum=0;
for(int i=3; i<=n; i++) {
for(int j=i-1; j>=1; j--) {
if(a[j]*2==a[i])
continue;
if(b[a[i]-a[j]]==true) {
sum++;
break;//每个数字和只能算一次
}
}
}
cout<<sum;
return 0;
}