原题链接:
HDU-6168
大意:
给一个串
an
,生成
bn
串,对应所有
bk=ai+aj(i≠j)
, 总共有
n∗(n−1)/2
个。
现在把
an
和
bn
混在一起,总共有
n∗(n+1)/2
个。
要求求出
an
。
思路:
先从最小的取出 a1,a2,然后算出 a1+a2.
去掉这三个之后最小的为 a3. 以此类推。
个数用 map 维护。按顺序下来即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back
#define pii pair<int,int>
#define eps 1e-8
//#define LOCAL
const int MAXN =125250+5;
vector<int> a,ans;
map<int,int> mp;
int m;
int main() {
while(~scanf("%d",&m)){
a.clear();
ans.clear();
for(int i=0;i<m;i++){
int x;
scanf("%d",&x);
a.pb(x);
mp[x]++;
}
sort(a.begin(),a.end());
ans.pb(a[0]);
mp[a[0]]--;
for(int i=0;i<m;i++){
if(mp[a[i]]==0) continue;
for(int j=0;j<ans.size();j++){
mp[a[i]+ans[j]]--;
}
ans.pb(a[i]);
mp[a[i]]--;
}
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
printf("%d%c",ans[i]," \n"[i==ans.size()-1]);
}
}
return 0;
}