CF 305C (set容器)
阿新 • • 發佈:2018-12-23
題目連結:http://codeforces.com/problemset/problem/305/C
題目大意:給你一個n表示有n個ai,ai表示2^ai。問你需要再加幾個b代表2^b,讓他們的總和為2^v-1。(v是任意一個數)。
思路:2^v-1的結果的二進位制表示肯定僅由1組成,所以我們就可以讓這些ai不重複(即每個數僅出現一次),設這些不重複的ai中最大的是maxx,那麼最後的結果就是看 讓1~maxx的數都僅出現一次要增加幾個數。
那麼怎麼保證ai僅出現一次呢?
其實也不難,就是維護一個set容器,我們知道set容器當中的數都是僅出現一次的,如果當前要插入的數在set中存在了,說明給出的ai中含有兩個相同的,由於2*2^ai=2^(ai+1),那麼就可以把原來的ai從set裡刪除,然後插入ai+1,注意這個過程是迴圈執行的,直到不存在相同的為止,也就是說如果上一步算出的ai+1依然在set中,那麼就要再刪除ai+1,判斷ai+2.....
自己模擬一遍兩個樣例就能明白了
這道題其實挺簡單的,但是我還是沒有想出來,唉
AC程式碼:
#include<iostream> #include<cstdio> #include<set> using namespace std; int main() { set<int> s; s.clear(); int n; int maxx=0; scanf("%d",&n); while(n--) { int x; scanf("%d",&x); while(s.count(x)) { s.erase(x); x++; } s.insert(x); maxx=max(maxx,x); } cout<<maxx-s.size()+1<<endl; return 0; }