Ivan and Powers of Two

 Ivan and Powers of Two
time 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
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.


思路:这里写中文思路吧,下面用英文下思路是因为四级还没过关,囧,必须要练练,不然完蛋了有木有啊

贪心。

首先要准备构造等比序列吧

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;}





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值