Partial Replacement
from Codeforces Round #710 (Div. 3)
Time limit:2s
Memory limit:256MB
简单的贪心思想,把第一个星号和最后一个星号标记好了以后,中间利用贪心思想,隔得越远越好。
ac代码:
#include<iostream>
#include<string>
using namespace std;
long long t,n,k,notepre = -1,noterear = n,sum; //t,n,k如题,notepre记录第一个*,
string s; //noterear记录最后一个*,sum表示最小替换个数
int main(){
cin>>t;
while(t--){
cin>>n>>k>>s;
sum = 0;
for(int i = 0;i < n;++i) //找到第一个
if(s[i] == '*'){
s[i] = 'x',notepre = i,++sum;
break;
}
for(int i = n - 1;i >= 0;--i) //找到最后一个
if(s[i] == '*'){
s[i] = 'x',noterear = i,++sum;
break;
}
for(int i = notepre;i < noterear - k;){ //贪心,隔得越远越好
for(int j = i + k;j > i;--j)
if(s[j] == '*'){
++sum,i = j;break;
}
if(s[i] == '*')
s[i] = 'x';
else
break;
}
cout<<sum<<"\n";
}
return 0;
}