欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[模拟]奶牛料槽

程序员文章站 2022-05-14 20:29:44
...

希望更好的阅读体验?点这里

题目:

约翰的农场里有很多奶牛,每次喂奶牛的时候,奶牛们挤在一起围成一圈,导致挤在后面的奶牛吃不到草料。于是约翰去市场买了 NN 个料槽,在农场里将这 NN 个料槽排成一行。每个料槽有两个位置,可供两头奶牛使用,这样每头奶牛就有了一个属于自己的固定的料槽位置,奶牛们终于可以愉快的享用大餐了。奶牛的食量有大有小,约翰将食量分为 55 个等级,等级为 11 表示食量最小。约翰为了掌握奶牛的健康状况,时常会对奶牛进行考察。例如约翰想对食量等级为 KK 的奶牛进行考察,那么约翰就会从这 NN 个料槽中选择连续的 LL 个料槽进行查看,要求这 LL 个料槽中至少每一个料槽有 11 头奶牛的食量等级刚好是 KK 。现在请你帮约翰找出L的最大值即对应的等级 KK

分析:

因为 KK 最大为 55 ,所以枚举 KK ,找到所有料槽中符合要求的连续料槽的个数,每次更新答案即可。

代码:

#include <cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
struct trough{
    int a,b;
}t[100003];
int main(){
    int n,L=-(1<<30),K;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].a,&a[i].b);
    for(int k=1;k<=5;k++){//枚举k
        int s=-(1<<30),i=1,j;//s为连续料槽的个数
        while(i<=n){
            if(t[i].a==k||t[i].b==k){
                for(j=i+1;j<=n&&(t[j].a==k||t[j].b==k);j++);
                //找到连续符合要求的料槽位置的右边界
                s=max(s,(j-1)-i+1);//注意j要减1,因为此时j已经不符合要求了
                i=j;
            }
            else ++i;
        }
        if(L<s) L=s,K=t;//更新答案
    }
    printf("%d %d\n",L,K);
    return 0;
}

noip模拟赛老师给我们做的,洛谷上有原题……

相关标签: 题解 OI