1. 程式人生 > >CF962D Merge Equals

CF962D Merge Equals

time using 序列 () 題意 roman color als n)

鏈接:

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",N-cnt); for(int i=1;i<=N;i++) if(a[i]) printf("%lld ",a[i]); return 0; }
View Code

CF962D Merge Equals