奶牛排队

Posted darlingroot

tags:

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

题意

 

【问题描述】

奶牛在熊大妈的带领下排成了一条直队。

显然,不同的奶牛身高不一定相同……

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A 是最矮的,最右边的B 是最高的,且B 高于A 奶牛,

且中间如果存在奶牛,则身高不能和A、B 奶牛相同,

问这样的一些奶牛最多会有多少头。

从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是零、二,但不会是一)。

【输入格式】

第一行一个数N(2<=N<=100000),表示奶牛的头数。

接下来N 个数, 每行一个数, 从上到下表示从左到右奶牛的身高( 1<= 身高<=maxlongint)。

【输出格式】

一行,表示最多奶牛数。

【输入样例】Tahort.in

5

1

2

3

4

1

【输出样例】Tahort.out

4

【样例解析】

取第1 头到第4 头奶牛,满足条件且为最多。

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

我实在是太弱了

题意都看错了

在最矮的奶牛和最高的奶牛之间的奶牛 高度可以是打乱的

而我

按照严格上升来做的

(竟然也水到了20分)

真是ggg

 

大佬说

这是个模拟qwq

 

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 100010;
int n,ans;
int v[maxn],que[maxn];//v[i]就是奶牛的高度,que[i]表示以i为结尾最长队列 

int main()
{
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
        scanf("%d",&v[i]);
    for(int i = 1;i <= n;i++)//遍历以每个奶牛为结尾的最长队列 
    {
        int id = i - 1,j = i - 1;
        while(j)
        {
            if(v[j] >= v[i])
                break;
            //如果i奶牛前面的奶牛比i奶牛高,那么i奶牛一定无法合并到前面的队列中,那么当前的最长的队列,还和以前的一样 
            if(v[que[j] + 1] < v[id + 1])
                id = que[j];
                //在j<i且以j为结尾的队列的开头小于以i为结尾的队列的开头时,两队列可以合并 
            j = que[j];
            //向前找前一个(未合并的)队列 
        }
        que[i] = id;
        ans = max(ans , i - id);
    }
    if(ans == 1)
        ans = 0;
    printf("%d",ans);
    return 0;
}

 

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

WOJ1109 奶牛排队

UOJ 281排队布局

Bzoj1731 排队布局

笔试算法题目,奶牛排队喝水

笔试算法题目,奶牛排队喝水

高手训练RMQ奶牛排队