奶牛排队
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; }
以上是关于奶牛排队的主要内容,如果未能解决你的问题,请参考以下文章