51 Nod 1267 4个数和为0
给了一组数找到4个数和为0
思路:肯定得先排序,和为0那么说明有正有负,易知任意两个相加等于另外两个的相反数,我们可以先枚举前两个,然后通过二分来查找剩下两个数的和res,从前往后枚举一个较小,从后往前枚举一个较大的。当res>sum时说明较大值取大了需缩小,res<sum,说明较小的取小了,应该增大。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int N= 1010; 5 int a[N]; 6 bool solve(int l,int r,int sum) 7 { 8 while(l<r) 9 { 10 if(a[l]+a[r]==sum) return true; 11 if(sum<a[l]+a[r]) r--; 12 else l++; 13 } 14 return false; 15 } 16 int main() 17 { 18 int n; 19 cin>>n; 20 for(int i=0;i<n;i++) 21 { 22 cin>>a[i]; 23 } 24 sort(a,a+n); 25 for(int i=0;i<n;i++) 26 { 27 for(int j=i+1;j<n;j++) 28 { 29 int sum=-(a[i]+a[j]); 30 if(solve(j+1,n-1,sum)) 31 { 32 cout<<"Yes"; 33 return 0; 34 } 35 } 36 } 37 38 cout<<"No"; 39 }

浙公网安备 33010602011771号