列表

详情


NC231894. 快攻猛男的早餐

描述

早晨,有 n 道菜顺序摆在 BreakFast 的面前。由于 BreakFast 比较挑食,因此他对每道菜会表现出喜欢或者不喜欢。同时,BreakFast 还具有强迫症,他必须把一段连续的菜作为早餐。但为了不影响 BreakFast 的好心情,他至多只会吃 k 道不喜欢的菜。

现在你想知道 BreakFast 的早餐一共有几种方案。

两种方案不同当且仅当两种方案中存在至少一道菜不一样。

输入描述

第一行输入一个整数  表示有 T 组测试数据。

对于每组测试数据,先输入两个整数 ,接下来一行输入一个长度为 n 的字符串 s。若 0 则表示 BreakFast 不喜欢第 i 道菜,否则若 1 则表示 BreakFast 喜欢第 i 道菜。

保证

输出描述

对于每组测试数据,输出一个整数表示 BreakFast 早餐的方案数。

示例1

输入:

2
8 4
01001000
3 3
111

输出:

32
6

原站题解

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

Python3 解法, 执行用时: 926ms, 内存消耗: 4796K, 提交时间: 2022-03-17 15:20:33

t = int(input())
for _ in range(t):
    n,k = [int(x) for x in input().split()]
    s = ' ' + input()
    cnt = 0
    res = 0
    dis = 0
    for i in range(n+1):
        if s[i] == '0':
            cnt += 1
            while (dis <= i) and (cnt > k):
                dis += 1
                if s[dis] == '0':
                    cnt -= 1
        res += (i - dis)
    print(res)
            

C++ 解法, 执行用时: 177ms, 内存消耗: 528K, 提交时间: 2021-12-12 20:23:03

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	int n,k,idx;
	char s[100010];
	while(t--)
	{
		long long ans=0;
		idx=0;
		cin>>n>>k>>s+1;
		int l=1;
		int r=1;
		while(r<=n)
		{
			if(s[r]=='0') idx++;
			while(idx>k)
			{
				if(s[l++]=='0') idx--;
			}
			ans+=r-l+1;
            r++;
		}
		cout<<ans<<endl;
	}
}

上一题