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.
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.
Print a single integer — the answer to the problem.
4 0 1 1 1
0
1 3
3
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;}