分析:二分代价,由于序列是单增的,我们使前面一个数相对取最小,这样后面的数变化的值也能相对较小(贪心)。
#include<iostream>
using namespace std;
#define N 100010
#define max(a,b) ((a)>(b)?(a):(b))
int num[N],tmp[N],n;
bool valid(int cost)
{
int i;
for(i=1;i<=n;i++)
tmp[i]=num[i];
tmp[1]=tmp[1]-cost;
for(i=2;i<=n;i++)
if(num[i]+cost<=tmp[i-1])
return false;
else
tmp[i]=max(num[i]-cost,tmp[i-1]+1);
return true;
}
int main()
{
int T,t,l,r,ans,mid,i;
cin>>T;
t=0;
while(T--)
{
cin>>n;
for(i=1;i<=n;i++) cin>>num[i];
ans=0;
l=0;
r=1000000;
while(l<=r) //二分代价
{
mid=(l+r)>>1;
if(valid(mid))
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
cout<<"Case #"<<++t<<":"<<endl;
cout<<ans<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/a809146548/article/details/46293235