题目描述
有N只奶牛从左往右排成一行,编号是1至N。这N只奶牛当中,有一些奶牛是黑色的,其余的是白色的。
color[i]表示第i只奶牛的颜色,如果color[i]=0则表示第i头奶牛是黑色的,如果color[i]=1则表示第i头奶牛是白色的。
六一奶牛儿童节快到了,农场主Farmer John要从这N头奶牛当中,挑选尽可能多的奶牛去参加晚会。
Farmer John挑选奶牛的原则是:挑选编号是连续的一段奶牛,这一段奶牛的颜色必须全部是白色的。
Farmer John有一个魔法棒,每用一次魔法棒就可以把一头黑色的奶牛变成一头白色的奶牛,魔法棒最多只能使用K次。
在上述条件下,最多可以有多少头奶牛去参加晚会呢?
输入输出格式
输入格式
第一行,两个整数,N和K。
第二行,N个整数,第i个整数就是color[i],color[i]要么是0,要么是1。
输出格式
一个整数,表示最多有多少头奶牛可以去参加晚会。
输入输出样例
输入样例一
11 0
1 1 0 0 1 1 1 1 0 1 1
输出样例一
4
输入样例二
11 1
1 1 0 0 1 1 1 1 0 1 1
输出样例二
7
说明
样例说明
样例一说明:由于K=0,所以不能使用魔法棒,所以挑选编号是5至8的奶牛去参加晚会。
样例二说明:由于K=1,所以最多可以使用1次魔法棒,使用魔法棒把第9头奶牛变成白色奶牛,然后挑选编号是5至11的奶牛去参加晚会。
题解
暴力尺取法遍历区间一遍即可,用魔法棒时就--k,恢复时就++k。
#include<iostream> #include<string> using namespace std; int n,k,color[100000000],a[100000000],sum,smax; int main() { cin>>n>>k; for(int i=1;i<=n;i++) { cin>>color[i]; a[i]=a[i-1]; if(color[i]==0) a[i]++; } for(int l=0,r=1;r<=n;r++) { if(a[r]-a[l]<=k) { sum++; if(r==n&&sum>smax) smax=sum; } else { if(sum>smax) smax=sum; l++; } } cout<<smax; return 0; }
原文地址:https://www.cnblogs.com/kcn999/p/10352408.html
时间: 2024-10-10 14:11:42