這是一道二分題,然而我做了好久都沒有發現~~~
跟去年的跳石頭有點相似,不斷縮小範圍:
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 100000000
using namespace std;
int a[100010],m,b[100010];
int check(int x){
for(int i=1;i<=m;i++)b[i]=a[i];
b[1]-=x;
for(int i=2;i<=m;i++){
b[i]-=x;
if(b[i-1]>=b[i]){
if (abs(x-(b[i-1]-b[i]+1))<=x)b[i]=b[i-1]+1;else return 0;
}
}
return 1;
}
int main(){
int i,j,k,n,_,Case=0;
scanf("%d",&_);
while(_--){
Case++;
bool flag=0;
scanf("%d",&m);
scanf("%d",&a[1]);
for(i=2;i<=m;i++){
scanf("%d",&a[i]);
if(a[i]<=a[i-1])flag=1;
}
if(!flag){
printf("Case #%d:\n%d\n",Case,0);
continue;
}
int l=0,r=inf;
while(l<=r){
int mid=(l+r)/2;
if(check(mid))r=mid-1;
else l=mid+1;
}
printf("Case #%d:\n%d\n",Case,l);
}
return 0;
}