分析:枚举a和b,在排序后的数组里二分查找c=-a-b。
注意:在找c的时候不能和a和b重复。
【参考代码】
#include <bits/stdc++.h>
using namespace std;
const int N=1000+5;
const int inf=0x3f3f3f3f;
int n;
int a[N];
set<pair<int,int>> vis;
multiset<int> s;//用multiset是因为有重复元素的存在
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s.insert(a[i]);
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
s.erase(s.find(a[i]));
for(int j=i+1;j<=n;j++){
s.erase(s.find(a[j]));
if(s.count(-a[i]-a[j])){
int b[3]={a[i],a[j],-a[i]-a[j]};
sort(b,b+3);
auto p=make_pair(b[0],b[1]);
if(!vis.count(p)){//去重,只要b[0]和b[1]在vis没找到就说明这是一个新的三元组
printf("%d %d %d\n",a[i],a[j],-a[i]-a[j]);
vis.insert(p);
}
}
s.insert(a[j]);
}
s.insert(a[i]);
}
return 0;
}