专栏文章

题解:P12350 「HCOI-R2」光影

P12350题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipfkc8p
此快照首次捕获于
2025/12/03 11:11
3 个月前
此快照最后确认于
2025/12/03 11:11
3 个月前
查看原文

P12350 「HCOI-R2」光影题解

思路

贪心。用一个 vector 记录 11 之间 00 的个数,从小到大排序,这样每次删除最少的 0011 的块数自然最少。
坑点:如果全是 00 答案应该为 00

代码

CPP
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main(){
	int n,k;
	cin>>n>>k;
	string s;
	cin>>s;
	int l=0,r=s.length();
	while (s[l]=='0') l++; //去除前导零 
	while (s[r]=='0') r--; //去除后导零 
	if (l==r){ //坑点 
		cout<<0;
		return 0;
	}
	int cnt=0; //暂存连续0的个数 
	for (int i=l;i<=r;i++){
		if (s[i]=='0'){
			cnt++;
		}
		if (s[i]=='1'){
			if (cnt!=0){ //避免重复计算 
				v.push_back(cnt);
			}
			cnt=0;
		}
	}
	sort(v.begin(),v.end()); //从小到大排序 
	cnt=0; //cnt记录可以合并的1的块数 
	for (int i:v){
		if (k>=i){
			k-=i;
			cnt++;
		}
		else{
			break;
		}
	}
	cout<<v.size()+1-cnt; //0的块数+1就是1的块数 
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...