1. 程式人生 > >【雜題集】【51NOD 1267】4個數和為0

【雜題集】【51NOD 1267】4個數和為0

www namespace quest color https question clas amp -a

4個數和為0

鏈接:

原題

題意:

... 這

思路:

由於(n=1000),O(n^2)的算法也可一試。

於是求任意兩數的和,轉化為兩數之和問題,在判斷重復即可。

但我感覺這道題略坑?總感覺我的代碼有問題...

代碼:

#include<iostream>
#include<algorithm>
using namespace std;

struct FormNumber {
    int num;
    int a,b;
};

int N,FN;
int Num[1000+100];
FormNumber FNum[
499500+100]; bool FormNumberCmp (FormNumber a,FormNumber b) { if (a.num==b.num) if (a.a<b.a) return a.b<b.b; else return a.a<b.a; else return a.num<b.num; } inline bool IsFormNumberNotOver (FormNumber a,FormNumber b) { if ((a.a!=b.a)&&(a.b!=b.b)&&(a.a!=b.b)&&(a.b!=b.a)) return
true; return false; } int main () { ios::sync_with_stdio(false); cin>>N; for(int i=1; i<=N; i++) cin>>Num[i]; for(int i=1; i<N; i++) for(int j=i+1; j<=N; j++) FNum[++FN]=(FormNumber) {Num[i]+Num[j],i,j}; sort(FNum+1,FNum+FN+1,FormNumberCmp);
int l=1,r=FN; while (l<r) { if (FNum[l].num+FNum[r].num==0&&IsFormNumberNotOver(FNum[l],FNum[r])) { cout<<"Yes"; return 0; } if (FNum[l].num+FNum[r].num>0) r--; else l++; } cout<<"No"; return 0; }

【雜題集】【51NOD 1267】4個數和為0