分析:二分代价,由于序列是单增的,我们使前面一个数相对取最小,这样后面的数变化的值也能相对较小(贪心)。
#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