给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。
从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
Input
第1行,1个数N,N为数组的长度(0 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
Output
如果没有符合条件的组合,输出No Solution。
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。
每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
Input示例
7
-3
-2
-1
0
1
2
3
Output示例
-3 0 3
-3 1 2
-2 -1 3
-2 0 2
-1 0 1
思路:set暴力+优化
1.纯set暴力
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 set<int> s,t; 5 set<int>::iterator it,jt,kt; 6 int main() { 7 ios::sync_with_stdio(false); 8 int n,data,sum=0; 9 cin>>n; 10 for(int i=1;i<=n;++i) { 11 cin>>data; 12 s.insert(data); 13 } 14 int flag=0; 15 for(it=s.begin();it!=s.end();++it) { 16 sum=0; 17 sum-=*it; 18 t=s; 19 jt=t.find(*it); 20 jt++; 21 for(;jt!=t.end();++jt) { 22 data=sum-*jt; 23 kt=t.find(data); 24 if(kt!=t.end()&&(*kt!=*jt)&&(*kt>*jt)) { 25 cout<<*it<<" "<<*jt<<" "<<*kt<<endl; 26 flag=1; 27 t.erase(*kt); 28 } 29 } 30 } 31 if(!flag) cout<<"No Solution"<<endl; 32 return 0; 33 }