题解:CF1901D Yet Another Monster Fight
因为每次攻击的怪物都与已被攻击过的怪物相邻,所以被攻击的怪物一定组成一个连通区间,且每次攻击都是在将这个区间向左或向右扩大一个位置。
假设我们选择的位置是
-
如果要攻击
p 左边某怪物i ,最坏情况是魔法最开始每次都往右边打((n-p) 次攻击),右边打完了以后再从p 向左边打到i ((p-i) 次攻击),算上最初的一次,打到i 最多需要(n-p)+(p-i)+1=n-i+1 次攻击,此时还剩下的攻击力为x-(n-i+1)+1=x-n+i 。要击杀这个怪物,攻击力必须大于其血量,所以x-n+i \ge a_i ,转化一下得到x \ge a_i+n-i 。 -
同理,如果要攻击
p 右边某怪物i ,最坏情况是魔法先往左边打(p-1) 次,再向右边打i-p 次打到i ,算上最初一次,一共i 次攻击。此时还剩下的攻击力为x-i+1 ,又因为x-i+1 \ge a_i ,所以x \ge a_i+i-1 。
综上所述,所选择的
而上述条件可以转化一下:
上面的最大值可以预处理,即可以设
解法也就出来了,枚举每一个可能的
核心代码:
for(int i=1;i<=n;i++)
lmax[i]=max(lmax[i-1],a[i]+n-i);
for(int i=n;i>=1;i--)
rmax[i]=max(rmax[i+1],a[i]+i-1);
int ans=0x7fffffff;
for(int i=1;i<=n;i++)
ans=min(ans,max({a[i],lmax[i-1],rmax[i+1]}));
AC 记录 + 完整代码