电话

精神病院有一个这样的测试。
给出一个正整数集合,集合中的数各不相同,然后要求病人回答:
其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

一开始对题意的理解很重要;我一开始用哈希表,却重复了许多答案 ,导致答案错误

错误代码如下(如果不想看可以跳过):
#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
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/qiuheqiuji/p/11178088.html