贪心的策略就是对于已知的操作限度,尽可能的减小每一个数与前面的数的差。显然最优答案可以实现严格递增的话,更大的答案也可以。考虑二分答案,贪心check即可。
ll a[211111];
ll n;
ll b[211111];
bool check(ll x)
{
b[0]=-1e18;
for(int i=1; i<=n; i++)
{
b[i]=a[i];
if(i==1)
{
b[i]=b[i]-x;
continue;
}
if(b[i]>b[i-1])
{
b[i]=max(b[i]-x,b[i-1]+1);
continue;
}
if(b[i]==b[i-1])
{
if(x!=0)
{
b[i]=b[i-1]+1;
}
continue;
}
if(b[i]<b[i-1])
{
b[i]=min(b[i]+x,b[i-1]+1);
continue;
}
}
for(int i=1; i<=n; i++)
{
if(b[i]<=b[i-1])
return false;
}
return true;
}
signed main()
{
ll t;
read(t);
ll ca=0;
while(t--)
{
read(n);
ll f=0;
ca++;
for(int i=1; i<=n; i++)
{
read(a[i]);
if(a[i]<=a[i-1])
{
f++;
}
}
printf("Case #%lld:\n",ca);
if(!f)
{
printf("0\n");
continue;
}
ll l=1,r=1e9;
ll ans=1e18;
for(int i=1; i<=100; i++)
{
ll mid=l+(r-l)/2;
if(check(mid))
{
ans=min(ans,mid);
r=mid;
}
else
{
l=mid;
}
}
printf("%lld\n",ans);
}
}