Bacteria (Gym - 101911C)
阿新 • • 發佈:2018-12-01
2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage
Bacteria
題意:像2048這個遊戲,相同的兩個可以合併在一起變成一個數(數值變成二倍),但是現在有一些數只有一個,所以需要新增一個和這些數相同的,讓他們可以合併在一起,現在問最小新增多少個數可以把所有的數合成一個。
題解:我感覺類似於資料結構中的哈夫曼編碼,最小編碼,所以每次取最小的兩個,如果這兩個相等,就合併然後放進去,如果不相同,那就先判斷2倍最小與次小的關係,如果是 2 * x1 > x2,那就沒有答案了,如果不是那麼 ans++。( 不過當時沒想到,就極限了一下,如果ans大於某個值就默認了不可以了。)
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n; while(~scanf("%lld",&n)) { priority_queue<ll, vector<ll>, greater<ll> > q; ll x; for(int i = 0; i < n; i ++) { scanf("%lld", &x); q.push(x); } ll cnt = 0; ll x1, x2; ll f = 0; if(n == 1) {printf("0\n");continue;} while(!q.empty()) { x1 = q.top(); q.pop(); if(!q.empty()) { x2 = q.top(); if(x1 == x2) { x1 = x1 + x2; q.pop(); q.push(x1); } else { x1 = 2 * x1; q.push(x1); cnt ++; } } else { break; } if(cnt > 3e5) {f = 1;break;} } if(f==0)printf("%lld\n",cnt); else printf("-1\n"); } return 0; }