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; }
时间: 2024-10-07 01:24:05