XYNUOJ 暑期集训第四次测试 A - 51Nod 1090 3个数和为0

A - 我可能不会求和了

给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。

Input

第1行,1个数N,N为数组的长度(0 <= N <= 1000) 
第2 - N + 1行:Aii(-10^9 <= Aii <= 10^9)

Output

如果没有符合条件的组合,输出No Solution。 
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。

Sample Input

7
-3
-2
-1
0
1
2
3

Sample Output

-3 0 3
-3 1 2
-2 -1 3
-2 0 2
-1 0 1
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n;
int num[1010];

//二分查找第三个数
int binSerch(int s,int value)
{
	int l=s,r=n-1;
	int mid;
	while(l<=r)
	{
		mid=(l+r)/2;
		if(num[mid]+value<0)
			l=mid+1;
		else if(num[mid]+value>0)
			r=mid-1;
		else
			return mid;
	}
	return -1;
}

int main()
{
	long long sum;
	bool flag;//flag用bool型变量
	while(~scanf("%d",&n))
	{
		for(int i=0; i<n; i++)
			scanf("%d",&num[i]);
		sort(num,num+n);
        //标记查找状态
		flag =false;
		for(int i=0; i<n-2; i++)
		{
			for(int j=i+1; j<n-1; j++)
			{
				sum=num[i]+num[j];
//要求三个数之和=0,如果此时两个数相加的绝对值大于最大的数或已经>0,则这两个数不能组合
				if(-sum>num[n-1] || sum>=0)
					continue;
				int pos = binSerch(j+1,sum);
				if(pos!=-1)
				{
					flag = true;
					printf("%d %d %d\n",num[i],num[j],num[pos]);
				}
			}
		}
		if(!flag)
			printf("No Solution\n");
	}
}

猜你喜欢

转载自blog.csdn.net/yxy602843889/article/details/81502228