题记:用二分来找出满足条件的最小代价。
这题还有个O(n)的做法(不会…)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int n;
bool check(int num)
{
int x = a[0], y;
for(int i=1; i<n; ++i)
{
y = a[i];
if(y <= x)
{
y = x + 1;
if(abs(y - a[i]) > num*2)
return false;
}
x = y;
}
return true;
}
int main(){
int t,cas=1;
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int l=0,r=1e6+10;
while(l<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("Case #%d:\n%d\n",cas++,r);
}
return 0;
}