题意
给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
解题思路
将数组从小到大排序,遍历前两个数,最后一个数采用二分查找。
参考代码
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 1000+2
int a[MAXN];
bool bs(int x,int l,int r){
while (l<=r){
int mid=(l+r)/2;
if (a[mid]==x) return 1;
else if (a[mid]>x) r=mid-1;
else l=mid+1;
}
return 0;
}
int main(){
int n;
while (cin>>n){
for (int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int flag=0;
for (int i=0;i<n-2;i++){
if (a[i]>0) break;
for (int j=i+1;j<n-1;j++){
int k=a[i]+a[j];
if (k>0) break;
if (bs(-k,j+1,n-1)==1){
flag=1;
cout<<a[i]<<" "<<a[j]<<" "<<(0-k)<<endl;
}
}
}
if (!flag) cout<<"No Solution"<<endl;
}
return 0;
}