1. 程式人生 > >CF 305C (set容器)

CF 305C (set容器)

題目連結: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;
 }