题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
(本题目为2014NOIP普及T1)
输入输出格式
输入格式:
共两行,第一行包含一个整数nnn,表示测试题中给出的正整数个数。
第二行有nnn个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
输出格式:
一个整数,表示测验题答案。
输入输出样例
输入样例#1:
4 1 2 3 4
输出样例#1:
2
说明
【样例说明】
由1+2=3,1+3=41+2=3,1+3=41+2=3,1+3=4,故满足测试要求的答案为222。
注意,加数和被加数必须是集合中的两个不同的数。
【数据说明】
对于100%100\%100%的数据,3≤n≤1003 ≤ n ≤ 1003≤n≤100,测验题给出的正整数大小不超过10,00010,00010,000。
集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和:这句话就可以说,等于两个数之和的那个数是最后的,前面的两个数是相加的,那么在开始的时候就可以用sort进行排序。
for(int i=0;i<n;i++){//因为只需要两个数两个数地计算,所以可以简单地弄两个循环,这里是数学的规律,如:1,2,3,4这四个数中选择两个数相加,要所有的组合方式,我们有1,2、1,3、1,4、2,3、2,4、3,4
for(int o=i+1;o<n;o++){
for(int p=0;p<n;p++){//重复地把所有的数挨个测试一遍是不是所有组合的和
if(a[p]==a[i]+a[o]&&b[p]!=1){//判定是否是所有组合的和。为了唯一性,所以要测试a是不是被动过的,b就是在这里派上用场的
bk++;
b[p]=1;//如果没动过就把a对应的b设成动过的
}
}
}
这一点是关键,在题解上面,用i、o作为两个较小的数,用p作为较大的数,在后来的运算中会存在重复的情况,所以用b[p]对其进行调节。
#include<string.h>
#include<bits/stdc++.h>
#include<algorithm>
#include<math.h>
#define M(a) memset(a,0,sizeof(a))
using namespace std;
int a[1010];
int b[1010];
int main()
{
int n;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
int num=0;
sort(a,a+n);
for(int q=0;q<n-2;++q)
{
for(int i=q+1;i<n-1;++i)
{
for(int j=i+1;j<n;++j)
{
if(b[j]==0&&a[j]==a[q]+a[i])
{
++num;
b[j]=1;
}
}
}
}
printf("%d\n",num);
return 0;
}