欲望以提升热忱,毅力以磨平高山!|

XichenOC

园龄:1个月粉丝:4关注:0

📂题解
🔖其他
2025-02-13 16:43阅读: 7评论: 0推荐: 0

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 中国大陆许可协议进行许可。

posted @   XichenOC  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起