电话

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

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

错误代码如下(如果不想看可以跳过):
#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;
}

 

转载于:https://www.cnblogs.com/qiuheqiuji/p/11178088.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值