1. 程式人生 > >51Nod1090 3個數和為0(二分查詢)

51Nod1090 3個數和為0(二分查詢)

這道題和基礎題裡面的1001 陣列中和等於K的數對這道題差不多。

思路:先排升序,讓數組裡的兩個數a[i]a[j]相加,然後在陣列下標j之後找(0-a[i[-a[j])

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
long long a[1005];
int n;
int Find(long long x,int l)//二分查詢
{
	int r=n-1;
	while(r>=l)
	{
		int mid=(r+l)/2;
		if(a[mid]==x) return 1;
		if(a[mid]<x) l=mid+1;
		else r=mid-1;
	}
	return 0;
}
int main()
{	
	cin>>n;
	int i,j,k;
	for(i=0;i<n;i++)
		cin>>a[i];
	sort(a,a+n); 
	int flag=0;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			if(a[i]<=a[j]&&a[j]<=(0-a[i]-a[j])&&Find(0-a[i]-a[j],j+1))			
			{
				flag=1;
				cout<<a[i]<<" "<<a[j]<<" "<<0-a[i]-a[j]<<endl;
			}
	if(!flag) cout<<"No Solution"<<endl;
	return 0;
}