CF1561C Deep Down Below
分析
首先可以确定的两点是:
-
每个洞穴是互不干扰的。也就是说,第 个洞穴能否通过,只和来第 个洞穴前的 有关。
-
必然存在一个 ,使得 时,过不了这个山洞; 时,能过这个山洞。
既然这样,我们就可以预处理出能过第 个洞穴的最小的 。
如何求呢?我们先给 赋一个最小值 ,一个一个地经过怪物,面对怪物 时,英雄的 为 ,如果 ,说明 太小了,我们要把它调到符合要求的最小值 ,也就是令 。
经过第 个洞穴的所有怪物后,我们就得到了第 个洞穴需要的最小的 。
接下来我们要求经过所有洞穴需要的最小力量 ,我们可以把每个洞穴按照 从小到大排序,排序时带上洞穴的怪物数量 。
接下来我们一个一个经过山洞 ,并记录前 个山洞的怪物数量前缀和 。
然后和前面怪物的计算方法一样,把山洞当成怪物,面对山洞 时,英雄的 为 ,如果 ,说明 太小了,我们要把它调到符合要求的最小值 ,也就是令 。
最后的 即为所求。
时间复杂度 ,主要是排序。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n,ans,a_i_j,sum;
struct asdf{
int power,k;
}b[N];
bool cmp(asdf x,asdf y){
return x.power<y.power;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ans=sum=0;
for(int i=1;i<=n;i++){
b[i].power=0;
scanf("%d",&b[i].k);
for(int j=1;j<=b[i].k;j++){
scanf("%d",&a_i_j);
b[i].power=max(b[i].power,a_i_j+2-j);
}
}
sort(b+1,b+n+1,cmp);
for(int i=1;i<=n;i++){
ans=max(ans,b[i].power-sum);
sum+=b[i].k;
}
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号