链接:
http://codeforces.com/problemset/problem/962/D
题意:给出一个整数序列。选择其中最小且出现两次及以上的数,把左边第一个加到左边第二个上,
再去掉左边第一个,不断重复上述过程,直到序列中的每个数都是唯一的,输出最后的序列。
分析:“每次选择最前面两个最小的数合并”<=>“每次选择最前面两个数合并”
#include<cstdio> #include<map> #include<algorithm> #include<cstring> using namespace std; long long a[300000]; map<long long,int> m; int main() { int N,cnt=0; scanf("%d",&N); for(int i=1;i<=N;i++) { scanf("%lld",&a[i]); while(m[a[i]]) { a[m[a[i]]]=0; m[a[i]]=0; a[i]*=2; cnt++; } m[a[i]]=i; } printf("%d ",N-cnt); for(int i=1;i<=N;i++) if(a[i]) printf("%lld ",a[i]); return 0; }