列表

详情


NC25578. Black & White

描述

你有一个长度为 n 的 01 串S,你可以执行最多 m 次操作。
对于每次操作,你可以选择一个位置 i 满足 ,翻转这一位的值,0变成1,1变成0。
定义一个 01 串的价值为其中最长连续0的个数和最长连续1的个数的较大值,求S在经过最多m次操作后的最大价值。

输入描述

* 第一行一个整数 T ,表示接下来有 T 个样例。
* 首先输入n,m,表示S串的长度n和操作次数m,其中
* 接下来输入一个长度为n的字符串S。

输出描述

一个整数,表示题面上描述的最大价值。

示例1

输入:

2
5 1
00101
2 1
01

输出:

4
2

说明:

第一个串翻转第三个位置,00001的价值为4;第二个串翻转第一个位置,11的价值为2。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 236ms, 内存消耗: 620K, 提交时间: 2022-09-12 21:19:12

#include <bits/stdc++.h>
using namespace std;
int t;
int main()
{
	cin>>t;
	while(t--)
	{
		string ch;
		int len,d,ans=0;
		cin>>len>>d>>ch;
		for(int i=0;i<len;i++)
		{
			int t=ch[i]-'0',dd=d,sum=0;
			for(int j=i;j<len;j++)
			{
				if(ch[j]-'0'!=t)
				{
					if(dd){dd--;
					}
					else{break;
					}
				}
				sum++;
			}
			ans=max(ans,sum);
		}
		cout<<ans<<endl;
	}
}

C++14(g++5.4) 解法, 执行用时: 115ms, 内存消耗: 2404K, 提交时间: 2019-05-05 14:26:36

#include<bits/stdc++.h>
using namespace std;
string s; 
int n,m;
int solve(char c){
	int cnt=0,res=0;
	for(int i=0,j=0;i<n;i++){
		if(s[i]==c)
			cnt++;
		while(cnt>m)
			cnt-=s[j++]==c;
		res=max(res,i-j+1);
	}
	return res;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		cin>>s;
		printf("%d\n",max(solve('1'),solve('0')));
	}
}

上一题