51nod 1267
阿新 • • 發佈:2018-12-19
運用尺取法或者二分查詢都可以解決。
二分查詢的時間複雜度O(n^2*log(n^2)),尺取法的時間複雜度O(n),下面是AC程式碼:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1000+5; struct node { int x,y;//原始座標 int s;//兩數和 } pre[maxn*maxn]; bool cmp(node a,node b) { return a.s<b.s; //應用尺取法注意首先排序 } int num[maxn]; int n,cnt; bool flag; int l,r,sum; int main() { scanf("%d",&n); for(int i=0; i<n; ++i) scanf("%d",&num[i]); cnt=0; flag=0; for(int i=0; i<n; ++i) for(int j=i+1; j<n; ++j) { pre[cnt].s=num[i]+num[j]; pre[cnt].x=i; pre[cnt].y=j; cnt++; } sort(pre,pre+cnt,cmp); l=0; r=cnt-1; while(l<r) { sum=pre[l].s+pre[r].s; if(sum>0) { r--; } else if(sum<0) { l++; } else if(sum==0) { if(pre[l].x!=pre[r].x&&pre[l].y!=pre[r].y&&pre[l].x!=pre[r].y&&pre[l].y!=pre[r].x) { flag=1; break; } else { l++; r--; } } } if(flag) printf("Yes\n"); else printf("No\n"); return 0; }