CF2059C Customer Service
CF2059C Customer Service
题目翻译:
给定 \(n\) 个队列,有 \(n\) 个时刻,给定一个增加序列。每个时刻都会将所有队列的值增加,但同时也要任选一个队列清零。求最后所有队列剩余值的中不包含的最小非负整数的最大值。
思路:
由于每一次都会清零,而清零后就相当于重新开始,所以一个队列的最终取值就是增加序列的后缀。那我们从零开始分析。
- 一个队列最后剩余 \(0\):也就是最后将他清零,所以任何增加序列都可以。
- 一个队列最后剩余 \(1\):那增加序列最后一位一定是 \(1\),且必须保证上一次是将他清零,这样保证最后剩一。
- 一个队列最后剩余 \(2\):由于最后一次清零和倒数第二次清零都保证了前两项。所以该队列最后至少是有两次的增加,那若要使最后为 \(2\),那自然两次都必须为 \(1\)。
同理可得其他情况。
所以问题就转化成最后的连续 \(1\) 的个数。先处理出所有队列的增加序列的最后连续为 \(1\) 的个数,将他从小到大排序,依次看是否存在对应数量的连续 \(1\) 的个数。若不存在就可以直接输出答案。(注意: 判断时是连续 \(1\) 的个数是否大于等于。大于也可以直接截取掉)
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=1;j<=n;j++){
int num;
scanf("%d",&num);
if(num==1){
cnt++;
}
else{
cnt=0;
}
}
a[i]=cnt;
}
sort(a+1,a+1+n);
int num=0;
for(int i=1;i<=n;i++){
if(a[i]>=num){
num++;
}
}
printf("%d\n",num);
}
}
本文作者:XichenOC
本文链接:https://www.cnblogs.com/XichenOC/p/18713942
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步