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 }

 

posted @ 2022-07-13 17:13  Armored_bear  阅读(30)  评论(0)    收藏  举报