Ivan and Powers of Twotime limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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 - 1 for
some integer v (v ≥ 0).
Help Ivan, find the required quantity of numbers.
Input
The first line contains integer n (1 ≤ n ≤ 105).
The second input line contains n space-separated integers a1, a2, ..., an (0 ≤ ai ≤ 2·109).
It is guaranteed that a1 ≤ a2 ≤ ... ≤ an.
Output
Print a single integer — the answer to the problem.
Sample test(s)input
40 1 1 1
output
0
input
13
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.
思路:這裡寫中文思路吧,下面用英文下思路是因為四級還沒過關,囧,必須要練練,不然完蛋了有木有啊
貪心。
首先要準備構造等比序列吧
1、如果序列裡面沒有相同的很好辦
2、如果非降序序列有相同的怎麼辦?
必須合并相同的兩個數,直到當前的這個數在集合裡面唯一。
理由:
(1)、a,a 合并成a+1是因為:2^a+2^a=2*2^a=2^(a+1),合并成一個和再加一個來和a進行組合是一樣的花費
(2)、再說2^a已經是大於低位的所有數字之和,所以出現2個a絕對不會考慮把a拿到低位去和其他數拼湊成低位的其他缺的數。也就是說對於當前ai而言:
不用去管低位,低位有什麼就是什麼,沒什麼就得補上,ai只需要往上考慮即可
AC Program:
#include<iostream>#include<stdio.h>#include<string.h>#include<set>using namespace std;//a,a exists,it must be combined cause //(1)a,a->a+1 can minimize the number//(2)2^a has been bigger than the lower bit numbers,it's impossible to be used to make//the sum of lower bit numbers.int main(){set<int>ss;int n;int a;cin>>n;int maxn=0;for(int i=0;i<n;i++){ cin>>a; while(ss.count(a))ss.erase(a),a++;//2^a+2^a=2*2^a=2^(a+1)//change until 'a' are the only one. ss.insert(a); maxn=max(a,maxn); }cout<<maxn+1-ss.size()<<endl;//system("Pause");return 0;}