B - Partial Replacement

***B - Partial Replacement ***

题目:

You are given a number k and a string s of length n, consisting of the characters ‘.’ and ‘’. You want to replace some of the '’ characters with ‘x’ characters so that the following conditions are met:
The first character ‘’ in the original string should be replaced with ‘x’;
The last character '
’ in the original string should be replaced with ‘x’;
The distance between two neighboring replaced characters ‘x’ must not exceed k (more formally, if you replaced characters at positions i and j (i<j) and at positions [i+1,j−1] there is no “x” symbol, then j−i must be no more than k).
For example, if n=7, s=..* and k=3, then the following strings will satisfy the conditions above:
.xx.xx;
.x
.xx;
.xx.xxx.
But, for example, the following strings will not meet the conditions:
.**.xx (the first character '’ should be replaced with ‘x’);
.x
.xx* (the last character ‘’ should be replaced with ‘x’);
.x
.xx (the distance between characters at positions 2 and 6 is greater than k=3).
Given n, k, and s, find the minimum number of '
’ characters that must be replaced with ‘x’ in order to meet the above conditions.
Input
The first line contains one integer t (1≤t≤500). Then t test cases follow.
The first line of each test case contains two integers n and k (1≤k≤n≤50).
The second line of each test case contains a string s of length n, consisting of the characters ‘.’ and ‘’.
It is guaranteed that there is at least one '
’ in the string s.
It is guaranteed that the distance between any two neighboring ‘’ characters does not exceed k.
Output
For each test case output the minimum number of '
’ characters that must be replaced with ‘x’ characters in order to satisfy the conditions above.

5
7 3
.**.***
5 1
..*..
5 2
*.*.*
3 2
*.*
1 1
*

3
1
3
2
1
#include<iostream>
int main()
{
    char s[10001]; 
    long long t,n,k,qq = -1,ss = n,sum;  //t,n,k如题
    cin>>t;
    while(t--)
    {
        cin>>n>>k>>s;
        sum = 0;
        for(int i = 0; i < n; ++i)                  //找到第一个
            if(s[i] == '*')
            {
                s[i] = 'x',qq = i,++sum;//printf("11    %d     ",i);
                break;
            }
        for(int i = n - 1; i >= 0; --i)             //找到最后一个
            if(s[i] == '*')
            {
                s[i] = 'x',ss = i,++sum;//printf("22    %d     ",i);
                break;
            }
        for(int i = qq; i < ss - k;)     //贪心,隔得越远越好
        {
            for(int j = i + k; j > i; --j)
                if(s[j] == '*')
                {
                    ++sum,i = j;
                    //printf("33    %d     \n",i);
                    break;
                }
            if(s[i] == '*')
                s[i] = 'x';
            else
                break;
        }
        //printf("     \n");
        cout<<sum<<"\n";
    }
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prime me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值