精神病院有一个这样的测试。
给出一个正整数集合,集合中的数各不相同,然后要求病人回答:
其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
一开始对题意的理解很重要;我一开始用哈希表,却重复了许多答案 ,导致答案错误
错误代码如下(如果不想看可以跳过):
#include<bits/stdc++.h>
using namespace std;
bool Hash[20005];
int main(){
freopen("telephone.in","r",stdin);
freopen("telephone.out","w",stdout);
int n,a,maxa=-1,ans=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a;
Hash[a]=1;
maxa=max(maxa,a);
}
for(int i=1;i<=maxa;++i)
for(int j=i+1;j<=maxa;++j){
if(Hash[i]&&Hash[j]&&Hash[i+j]&&i!=j) ans++;
}
cout<<ans<<endl;
return 0;
}
标红的地方是有错误的,因为题目只要求算集合中的符合条件的数,
而我却把i+j当作目标(不同的i,j相加很可能会得到相同的n)
于是就只得了20分;
以后一定要认真审题,明白题意。
正确代码如下:
#include <cstdio> const int N = 200010; int n, ans; int a[N], f[N]; int main(){ scanf("%d", &n); for(int i=1;i<=n;++i) scanf("%d", a + i); for(int i=1;i<=n;++i) for(int j=1;j<i;++j) f[a[i] + a[j]] = 1; for(int i=1;i<=n;++i) if (f[a[i]]) ++ans; printf("%d\n", ans); return 0; }