解题思路:
1.本题比较符合普及组第一题的难度,实现难度不大,但是有很多坑点
2.首先可以想到,利用数组进行桶排序,因为数据量不大,最大数字不超过10000,将集合中的数字有序的输入到桶中
3.接下来枚举每一位数字和他后面的数字依次相加,如果两个数字都在桶中,并且他俩的和也在集合中的话,重点来了!并不是直接计数器增加,因为一个数字可能有多组不同的两个数相加得来,比如5可以由1和4组成,也可以由2和3组成,我们要求的只是满足就行,所以要利用另一个数组记录ans[i+j]++,表示i+j这个数可以由两个不同的数组成
4.最后,遍历ans数组即可,如果此位置的元素值大于等于1,说明满足,sum++
#include<bits/stdc++.h>
using namespace std;
bool a[20010];
int ans[20010];
int main()
{
int n,x,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
a[x]=1;
}//利用桶排序的方法,将数据输入,值为1的下标数字存在集合中
for(int i=1;i<=10000;i++)//枚举每一个数字
{
if(a[i]==1)//如果这个数字在集合中
for(int j=i+1;j<=10000;j++)//枚举当前数字后面的所有数字
{
if(a[j]==1&&a[i+j]==1)//如果j位置数字在集合中,并且i+j的和也在集合中
ans[i+j]++;//那么ans数组中对应的i+j下标的元素值累加
}
}
for(int i=1;i<=20010;i++)//遍历ans数组
{
if(ans[i]>=1)//如果元素值不为0,说明存在这个数
sum++;
}
cout<<sum;
return 0;
}