给定序列$A = \{A_1, A_2,...,A_n\}$, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:$B_i < B_{i+1}, 1 \leq i < N$)。
我们定义从序列A到序列B变换的代价为$cost(A, B) = max(|A_i - B_i|) (1 \leq i \leq N)$。
请求出满足条件的最小代价。
注意,每个元素在变换前后都是整数。
我们定义从序列A到序列B变换的代价为$cost(A, B) = max(|A_i - B_i|) (1 \leq i \leq N)$。
请求出满足条件的最小代价。
注意,每个元素在变换前后都是整数。
对于每一组:
第一行为序列A的长度$N(1 \leq N \leq 10^5)$,第二行包含N个数,$A_1, A_2, ...,A_n$.
序列A中的每个元素的值是正整数且不超过$10^6$。
第一行输出:"Case #i:"。i代表第 i 组测试数据。
第二行输出一个正整数,代表满足条件的最小代价。
2 2 1 10 3 2 5 4
Case #1: 0 Case #2: 1
#include<cstdio>
int a[100005],n;
bool cmp(int mid)
{
int t,i;
t=a[0]-mid;
for(i=1;i<n;i++)
{
if(a[i]+mid<=t)
return false;
else if(a[i]-mid<t+1)
t+=1;
else
t=a[i]-mid;
}
return true;
}
int main()
{
int t,j=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int i,left=0,right=1000005,mid,k=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
while(left<=right)
{
mid=(left+right)/2;
if(cmp(mid))
{
right=mid-1;
k=mid;
}
else
left=mid+1;
}
printf("Case #%d:\n",j++);
printf("%d\n",k);
}
}