0
点赞
收藏
分享

微信扫一扫

51nod 1267 4个数和为0


1267 4个数和为0

  1. 1.0 秒
  2.  
  3. 131,072.0 KB
  4.  
  5. 20 分
  6.  
  7. ​​3级题​​

给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。

 收起

输入


第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)


输出


如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。


输入样例


5 -1 1 -5 2 4


输出样例


Yes


 

排序+二分,两两合并,二分查找,注意记录一下下标,因为要求记录不同的数。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+5;
int n;
struct Node
{
int x,y;
LL sum=0;
};
vector<Node> v;
bool cmp(Node a,Node b)
{
return a.sum<b.sum;
}
int a[N];
int check(int i,int mid)
{
//cout<<v[i].x<<" "<<v[i].y<<" "<<v[mid].x<<" "<<v[mid].y<<endl;
if(v[i].x!=v[mid].x&&v[i].x!=v[mid].y&&v[i].y!=v[mid].x&&v[i].y!=v[mid].y)
{
if(v[i].sum+v[mid].sum==0)
return 1;
else if(v[i].sum+v[mid].sum>0)
return 2;
else
return 0;
}
if(v[i].sum+v[mid].sum>=0)
return 2;

return 0;

}
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=1; i<n; i++)
{
for(int j=i+1; j<=n; j++)
{
//cout<<i<<" "<<j<<endl;
Node p;
p.x=i;
p.y=j;
p.sum=a[i]+a[j];
v.push_back(p);
}
}
sort(v.begin(),v.end(),cmp);
for(int i=0; i<v.size(); i++)
{
//cout<<v[i].x<<" "<<v[i].y<<" "<<v[i].sum<<endl;
int l=0,r=v.size()-1;
while(l<r)
{
int mid=(l+r)>>1;
if(check(i,mid))
r=mid;
else
l=mid+1;
}
if(check(i,l)==1)
{
printf("Yes\n");
return 0;
}


}
printf("No\n");


return 0;
}

 

举报

相关推荐

0 条评论