题目链接

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