题目链接
https://vjudge.net/contest/394826#problem/E
解题思路
先求出每两个数的和,再循环所有的数,判断是否存在等于两数和相反数的数且此数与求和两数不相等,那么这就是一组答案,将这组答案从小到大排序,得到所有情况,最后按要求输出最终答案。
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=2010; map<ll,ll> mp; int n,m; ll num[N]; struct ANS{ ll f[5]; }ans[1000009]; bool cmp(ANS a,ANS b){ if(a.f[0]!=b.f[0]) return a.f[0]<b.f[0]; else return a.f[1]<b.f[1]; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>num[i]; mp[num[i]]=1; } for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){ ll k=-(num[i]+num[j]); if(k==num[i]||k==num[j]) continue;//要是此数与构成和的两数相等,不为其中一个答案 if(mp[k]==1){//存在 ans[m].f[0]=num[i]; ans[m].f[1]=num[j]; ans[m].f[2]=k; sort(ans[m].f,ans[m].f+3); m++; } } sort(ans,ans+m,cmp); if(m==0){cout<<"No Solution\n"<<endl;return 0;} else for(int i=0;i<m;i+=3) cout<<ans[i].f[0]<<' '<<ans[i].f[1]<<' '<<ans[i].f[2]<<endl; }
总结
由衷感觉这个代码的实现好牛*啊!
过一阵再附上4个数和为0的题解!(或许忘了)
4 Values whose Sum is 0(更新于20201105)
前言
我靠,我真的忘了,直到做到个4个数和为0的题,我隐约记得我好像做过3个数和为0的题,一看博客,居然留下了小尾巴。
题解链接
https://blog.nowcoder.net/n/050a3be9a6ee458cb0fb36beea233b81