题解黑白奶牛

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解黑白奶牛相关的知识,希望对你有一定的参考价值。

题目描述

        有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

 

输出样例一

 

输入样例二

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;
}

 

以上是关于题解黑白奶牛的主要内容,如果未能解决你的问题,请参考以下文章

题解幸运奶牛

题解 P1868 饥饿的奶牛

洛谷1578:[WC2002]奶牛浴场——题解

题解款待奶牛

洛谷 P2341 [HAOI2006]受欢迎的牛 题解

题解晚餐队列安排