分析:枚举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 ",a[i],a[j],-a[i]-a[j]); vis.insert(p); } } s.insert(a[j]); } s.insert(a[i]); } return 0; }