電話番号

2833 ワード

精神病院にはこのようなテストがあります。正の整数の集合を与えて、集合の中の数はそれぞれ異なって、それから患者に答えを求めます:その中に何個の数があって、ちょうど集合の中の他の2つの(異なる)数の和に等しいですか?


最初は題意の理解が重要でした.最初はハッシュ表を使っていましたが、多くの答えを繰り返して、答えが間違っていました.
エラーコードは以下の通りです(見たくなければスキップできます):#includeusing 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< return 0;} 標紅のところは間違いがあって、テーマは集合の中の条件に合致する数を求めるだけで、私はi+jを目標として(異なるi、jを加算すると同じnを得る可能性が高い)、そこで20点しか得られませんでした;これからは必ずまじめに問題を審査し,問題の意味を理解しなければならない.
正しいコードは次のとおりです.
#include 
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;jj)
          f[a[i] + a[j]] = 1;
    for(int i=1;i<=n;++i) if (f[a[i]]) ++ans;
    printf("%d
", ans); return 0; }