题目地址:http://codeforces.com/contest/305/problem/C
题目的意思:
给你n个ai
然后问你还要加多少个2^b,使得整个的和为一个2^v-1
要是这是一个和的话,就要是一个等比数列
那么怎么做呢?
也就是我们要加了之后使得
2^a1 ,2^a2,...,2^an是等差的
而且如果有两个相同的a的话,就合并
那么在不能合并的时候我们就找出最大的ai
那要加的和就是当前数列的ai的个数cnt(合并之后的)
则还要加的就是max(ai)-cnt+1
下面上代码:
#include<cstdio>
using namespace std;
const int maxn=100000+10;
int a[maxn];
int main()
{
int cnt;
int n;
scanf("%d",&n);
for(int i=n-1;i>=0;i--)
scanf("%d",&a[i]);
int _max=-0x3f3f3f3f;
int cnts=0;
while(n>0)
{
int j=n-1;
while(j && a[n-1]==a[j-1])j--;//来看在当前数组里面和最后一个相同的有多少个
cnt=n-j;
if(cnt&1)//如果有奇数个,那么一定有一个不会被约掉
{
cnts++;
n--;
if(_max<a[n])
_max=a[n];
}
cnt=cnt/2;
n=n-cnt;//将当前的标记移动cnt/2,因为合并了cnt/2
for(int i=0;i<cnt;i++)
a[n-1-i]++;
}
printf("%d\n",_max-cnts+1);
return 0;
}