给定序列
A={A1,A2,...,An} , 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:
Bi<Bi+1,1≤i<N )。
我们定义从序列A到序列B变换的代价为
cost(A,B)=max(|Ai−Bi|)(1≤i≤N) 。
请求出满足条件的最小代价。
注意,每个元素在变换前后都是整数。
Input
第一行为测试的组数
T(1≤T≤10) .
对于每一组:
第一行为序列A的长度
N(1≤N≤105) ,第二行包含N个数,
A1,A2,...,An .
序列A中的每个元素的值是正整数且不超过
106 。
Output
对于每一个测试样例,输出两行:
第一行输出:"Case #i:"。i代表第 i 组测试数据。
第二行输出一个正整数,代表满足条件的最小代价。
Sample Input
Sample Output
http://acm.hdu.edu.cn/showproblem.php?pid=5248
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<vector>
#include<cmath>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define ll long long
#define eps 10e-7
using namespace std;
int x[100001];
int n,s;
int check(int p){
int w=x[0]-p;
for(int i=1;i<n;++i){
if(max(w+1,x[i]-p)>x[i]+p)
return 0;
w=max(w+1,x[i]-p);
}
return 1;
}
int main(){
int t;
scanf("%d",&t);
int cnt=0;
while(t--){
printf("Case #%d:\n",++cnt);
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&x[i]);
}
int mid;
int l=0,r=10000000;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)){
s=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%d\n",s);
}
return 0;
}