96pts求调,WA on#7,玄关,拜谢
查看原帖
96pts求调,WA on#7,玄关,拜谢
737219
YONEX楼主2024/8/19 09:57

RT

#include<bits/stdc++.h>
using namespace std;
int n,k;
char s[100005],e[100005];
bool tp(){
	for(int i=0;i<n;i++){if(i%2==0)e[i]='N';else e[i]='F';}
	int f=0;
	for(int i=0;i<n;i++)if(e[i]!=s[i])f++;
	return (f<=k||n-f<=k);
}//对1的特判 
char fz(char a){
	if(a=='N')return 'F';
	else return 'N';
}
bool pd(int d){
	int l=1,g=0;
    char y=s[0];
	for(int i=1;i<n;i++){
		if(s[i]==y)l++;
		else {y=s[i];l=1;}
		if(l>d){g++;l=1;y=fz(s[i]);}
	}
	return g<=k;
}
//判断思路:从头开始找连续的字符,发现连续字符超过mid就改变一个,次数g++,最后判断g是否<=k 
//如果d是1的话,分两种情况,即从s【0】开始改和从s【1】开始改 ,因此直接特判即可 
int main(){
	cin>>n>>k>>s;
	if(tp()){cout<<1;return 0;}
	int l=2,r=n;
	while(l<r){
		int mid=(l+r)/2;
		if(pd(mid))r=mid;
		else l=mid+1;
	}
	cout<<l;
	return 0;
}
2024/8/19 09:57
加载中...