第2 - N + 1行:A i (-10^9 <= A i <= 10^9)
5 -1 1 -5 2 4
Yes
暴力枚举就可以了,注意一点就是不可以一起加起来与0比较,不然会long long会爆的。
只需要前者两个数的和,与后者的两个数的和是不是成相反数,就可以了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long a[1100];
long long sum;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
int flag = 0;
for(int i=0;i<n;i++)
{
if(a[i]>0) break;
for(int j=i+1;j<n;j++)
{
sum = a[j]+a[i];
int k=j+1;
int t=n-1;
while(t>k)
{
if(a[k]+a[t]==-sum)
{
flag=1;
break;
}else
{
if(a[k]+a[t]>-sum)
{
t--;
}else{
k++;
}
}
}
}
if(flag) break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}
温馨提示:
这样的时间少一点,最里面的时间复杂度是O(N-X)次,如果两层的循环的话,就是O(N*(N-1))大约,会超时间的。