思路:二分求最小代价,使前面的值相对较小,这样后面的数值增加相对较小。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include <string>
#include<string.h>
#include<map>
#include<utility>
#include<set>
#include<queue>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define eps 1e-8
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pii pair<int,int>
#define ll long long int
#define maxn 100005
int a[maxn],b[maxn],n;
bool check(int x)
{
for(int i=1;i<=n;i++)
b[i]=a[i];
for(int i=1;i<=n;i++)
{
if(i==1) {
b[i]=b[i]-x;
continue;
}
if(b[i]<=b[i-1]){
if(b[i-1]+1-b[i]<=x) b[i]=b[i-1]+1;
else return false;
}
else if(b[i]-x>b[i-1]) b[i]=b[i]-x;
else b[i]=b[i-1]+1;
}
return true;
}
int main()
{
int T,t=0;
rd(T);
while(T--){
printf("Case #%d:\n",++t);
rd(n);
for(int i=1;i<=n;i++)
{
rd(a[i]);
}
int l=0;
int r=maxn*10;
int ans=0;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) {
ans=mid;
r=mid;
}
else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}