【Ivan and Powers of Two】【CodeForces - 305C】(思維)(Set 應用)
題目:
Ivan has got an array of n non-negative integers a1, a2, ..., an. Ivan knows that the array is sorted in the non-decreasing order.
Ivan wrote out integers 2a1, 2a2, ..., 2an on a piece of paper. Now he wonders, what minimum number of integers of form 2b (b ≥ 0) need to be added to the piece of paper so that the sum of all integers written on the paper equalled 2v
Help Ivan, find the required quantity of numbers.
Input
The first line contains integer n (1 ≤ n ≤ 105). The second input line contains nspace-separated integers a1, a2, ..., an (0 ≤ ai ≤ 2·109). It is guaranteed that a1 ≤ a
Output
Print a single integer — the answer to the problem.
Examples
Input
4 0 1 1 1
Output
0
Input
1 3
Output
3
Note
In the first sample you do not need to add anything, the sum of numbers already equals 23 - 1 = 7.
In the second sample you need to add numbers 20, 21, 22.
解題報告:首先咱們需要的數學儲備知識,(2^a+2^a)=2^(a+1) ,2^1+2^2……+2^n=2^(n+1)-1;接下來咱們可以開始了,所求的是滿足題意的 :將所有的陣列元素進行2的冪數操作,然後求和,問再新增幾位數可以使和滿足2^v-1,因為題目沒有要求是否最小新增,所以利用set,將陣列元素相同的進行合併操作,然後找出最大的數字,之前的用數補齊,那麼所補數的數目就是輸出的數值。
ac程式碼:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
set<int > ss;
int main()
{
int n,a;
while(scanf("%d",&n)!=EOF)
{
ss.clear();
int maxx=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
while(ss.count(a))
{
ss.erase(a);
a++;
}
ss.insert(a);
maxx=max(maxx,a);
}
printf("%d\n",maxx-ss.size()+1);
}
return 0;
}