题目:
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000)
第2 - N + 1行:Aii(-10^9 <= Aii <= 10^9) Output 如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。 Sample Input
5
-1
1
-5
2
4
Sample Output
Yes
思路:看了好久才终于有那么点儿理解这个题了,我们想求4个数想加等于0,那么我们肯定是先要对这个数组进行排序了,因为是四个数嘛,而我们排过序之后前边的数都是比较小的数,后边的数都是比较大的数,我们想要四个数相加等于0,那么他们的相反数肯定是相等的了,也就是sum1 = a+b ,sum2 = c+d 且a<b<c<d。我们是不是可以先在这里先找到前边比较小的两个数 a 和 b 然后我们在后边找到比较大的两个数能和它相加等于0.
话不多说,自己多思考一下就好了,自我感觉代码还是挺简单的,比较容易理解的,上代码:
#include<iostream>
#include<algorithm>
using namespace std;
long long num[1100];
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;++i)
cin>>num[i] ;
sort(num,num+n) ;
for(i=0;i<n;++i)
{
for(j=i+1;j<n;++j)
{
long long sum=-num[i]-num[j];
int l=j + 1 , r = n-1;
while(l<r)
{
if(num[l]+num[r]==sum)
{
cout<<"Yes"<<endl;
return 0;
}
if(num[l]+num[r]>sum)
r--;
else
l++;
}
}
}
cout<<"No"<<endl;
return 0;
}