题意:一个序列由原序列的任意两个数相加得到,给出新序列,求原序列
题解:找到最小的两个值就是原序列的最小的两个,删掉两个数的和,重复上面步骤
#include <bits/stdc++.h> #define ll long long #define maxn 130100 using namespace std; map<int,int>mp; int a[maxn], ans[maxn]; inline void gg(int x){if(mp[x] == 1) mp.erase(x);else mp[x]--; } int main(){int n, num, t;while(~scanf("%d", &n)){num = 0; mp.clear();for(int i=0;i<n;i++) scanf("%d", &t), mp[t]++;ans[num++] = mp.begin()->first;gg(ans[num-1]);ans[num++] = mp.begin()->first;gg(ans[num-1]);while(1){for(int i=0;i<num-1;i++)gg(ans[i]+ans[num-1]);if(mp.size() == 0) break;ans[num++] = mp.begin()->first;gg(ans[num-1]);}cout<<num<<endl;for(int i=0;i<num;i++)printf("%d%c", ans[i], i==num-1?'\n':' ');}return 0; }