【雜題集】【51NOD 1267】4個數和為0
阿新 • • 發佈:2017-06-19
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)) returntrue; 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