给出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"。 Sample Input
5 -1 1 -5 2 4Sample Output
Yes
我一一开始写的深搜,不出意外的超时了,然后看了看别人的代码才想开可以把两个数相加的结果存到数组里然后排序,然后用双指针从两头开始查找。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll q[10000];
struct Node
{
ll x,y,w;
}s[1005 * 1005];
bool compare(Node x,Node y)
{
return x.w < y.w;
}
int main()
{
ll k;
scanf("%lld",&k);
int u = 0;
for(ll i = 0 ; i < k ; i++)
{
scanf("%lld",&q[i]);
}
for(ll i = 0 ; i < k ; i++)
{
for(ll j = i + 1 ; j < k ; j++)
{
s[u].x = i;
s[u].y = j;
s[u++].w = q[i] + q[j];
}
}
sort(s,s + u,compare);
ll l = 0,r = u - 1;
int flag = 0;
while(l <= r)
{
if(s[l].w + s[r].w == 0)
{
if(s[l].x != s[r].x && s[l].x != s[r].y && s[l].y != s[r].x && s[l].y != s[r].y)
{
flag = 1;
break;
}
else
{
l++;
r--;
}
}
if(s[l].w + s[r].w > 0)
{
r--;
}
if(s[l].w + s[r].w < 0)
{
l++;
}
}
if(flag == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}