1. 程式人生 > >51nod 1267 二分

51nod 1267 二分

cin 一段 name amp panel 結構體 空間 www 如果

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267

1267 4個數和為0技術分享

基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級算法題 技術分享 收藏 技術分享 關註 給出N個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出"Yes",否則輸出"No"。 Input
第1行,1個數N,N為數組的長度(4 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
Output
如果可以選出4個數,使得他們的和為0,則輸出"Yes",否則輸出"No"。
Input示例
5
-1
1
-5
2
4
Output示例
Yes
將所有兩個不同的數的和以及下標封入一個結構體裏,然後按照和排序後循環對每一個和二分查找他的相反數的下標,找到一段待匹配的數據,只要相加為零且四個下標相互不沖突即表示可以。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<set>
 6 #include<ctime>
 7 #include<functional>
 8
#include<algorithm> 9 using namespace std; 10 #define LL long long 11 int A[1005]; 12 struct node 13 { 14 LL w; 15 int a, b; 16 node() {}; 17 node(LL s, int a, int b):w(s), a(a), b(b) {}; 18 bool operator<(const node& tmp)const { 19 return w < tmp.w; 20
} 21 }P[1000005]; 22 int main() 23 { 24 int N, i, j, k,p=0; 25 cin >> N; 26 for (i = 1;i <= N;++i) 27 { 28 scanf("%d", &A[i]); 29 for (j = 1;j < i;++j) 30 { 31 p++; 32 P[p].w = (LL)A[i] + A[j]; 33 P[p].a = j; 34 P[p].b = i; 35 } 36 } 37 P[p + 1].w = 1e18; 38 bool ok = 0; 39 sort(P + 1, P + 1 + p); 40 for (i = 1;i <= p;++i) 41 { 42 int k = lower_bound(P+1,P+2+p,node(-P[i].w,0,0))-P; 43 if (P[k].w != -P[i].w) continue; 44 for (j = k;P[j].w == -P[i].w&&j <= p;j++) { 45 if (P[i].a!=P[j].a&&P[i].a!=P[j].b&&P[i].b!=P[j].a&&P[i].b!=P[j].b) { ok = 1;break; } 46 } 47 if (ok)break; 48 } 49 ok ? puts("Yes") : puts("No"); 50 //system("pause"); 51 return 0; 52 }

51nod 1267 二分