51nod 1267 4个数和为0(二分)

来源:互联网 发布:中建上海设计院 知乎 编辑:程序博客网 时间:2024/05/16 05:38

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

先存好任意两个数之和,然后排序,而二分查找每个和的相反数是否存在即可。

#include<iostream>#include<algorithm>using namespace std;#define maxn 1005int s[maxn],k;struct node{                int sum,num1,num2;}a[maxn*maxn];         //保存任意两个数之和以及它们的编号 int cmp(node x,node y)           //按照和从小到大的顺序排序 {    return x.sum<y.sum;}int check(int x,int y)         //检查是不是四个互不相同的数 {    return a[x].num1!=a[y].num1&&a[x].num1!=a[y].num2&&a[x].num2!=a[y].num1&&a[x].num2!=a[y].num2;}int find(int x)            //二分查找 x 的相反数 {    int l=0,r=k-1;    while(l<=r)    {        int mid=(l+r)/2;        if(a[x].sum+a[mid].sum==0)        {            if(check(x,mid))              return 1;            else              l=mid+1;        }        else if(a[x].sum+a[mid].sum>0)          r=mid-1;        else          l=mid+1;    }     return 0;}int main(){    int n;    while(cin>>n)    {        for(int i=0;i<n;i++)          cin>>s[i];        int ans=0;        k=0;        for(int i=0;i<n;i++)          for(int j=i+1;j<n;j++)          {              a[k].sum=s[i]+s[j];              a[k].num1=i;              a[k].num2=j;              k++;          }        sort(a,a+k,cmp);        for(int i=0;i<k;i++)          if(find(i))            ans++;        if(ans)          cout<<"Yes"<<endl;        else          cout<<"No"<<endl;     }    return 0;} 
原创粉丝点击