51Nod - 1267 4个数和为0(二分思想+排序)

 

题目:

给出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; 
} 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值