分析:题意可以理解为,给你含有n个正整数的数组a,让你找一个严格单调递增的数组b,使得cost(a,b)=max(|a[i]-b[i]|) (1<=i<=n)最小,我们可以二分查找答案,对于一个d,我们找一个数组b,看是否满足所有的cost<=d,如果满足则ans<=d,否则ans>d.找数组b的时候,b[i]肯定要>=a[i]-d,且b[i]>=b[i-1]+1,所以我们取这两个中较大的,如果b[i]>a[i]+d的话,那么cost就>d了,不满足条件,返回false。
# include <stdio.h>
int n,a[100005],b[100005];
int Max(int a,int b)
{
return a>b?a:b;
}
bool F(int d)
{
int i;
b[0]=a[i]-d-1;
for(i=1;i<=n;i++)
{
b[i]=Max(a[i]-d,b[i-1]+1);
if(b[i]>a[i]+d)
return false;
}
return true;
}
int main()
{
int i,t=1,T,l,r,mid;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("Case #%d:\n",t++);
l=0;r=1000000;
while(l<r)
{
mid=(l+r)/2;
if(F(mid))
r=mid;
else
l=mid+1;
}
printf("%d\n",l);
}
return 0;
}