解题思路:

    1.a[]用于存储小队中每个队员的战力值。

    2.l[]用于存入a数组元素中左边第一个大于它的元素的位置;

    同理:r[]则是存入a数组中每个元素右边第一个大于它的元素的位置。

    3.对于其中一个元素a[i],如果我们求出了其左边第一个>=它的数,把它的下标存入l[i],那么我们就可以列出其中一个小队为l[i]到i之间的长;

    同理:对于其中一个元素a[i],如果我们求出了其右边第一个>=它的数,把它的下标存入r[i],那么我们就可以列出其中一个小队为i到r[i]之间的长。

    4.栈在一次筛选后,栈顶 (x / y) 元素 就是这个a[i] 左边 / 右边 第一个大于等于a[i]的元素坐标

    最后再进行对比,即可求出最大值


注意事项:

参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;


int a[N];//存入每个队员的战力
int l[N];//用于存储 左边 第一个 大于等于 对应a数组元素的最近坐标
int r[N];//用于存储 右边 第一个 大于等于 对应a数组元素的最近坐标
stack<int>x,y;//创建两个栈 

int main()
{
	//关闭流,节省cin和cout时间 
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//输入
	int n,i;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	//完善l[]
	for(i=1;i<=n;i++)
	{
		while(x.size() && a[x.top()]<a[i])//当栈不空时,保证栈顶元素一定是大于等于a[i]或是空的 
		{//这里是while,注意了 
			x.pop();
		}
		if(x.size())//如果此时栈存在空间,则栈顶元素就是这个a[i]左边第一个大于等于a[i]的元素坐标
		{
			l[i]=x.top();
		}
		else//否则,a[i]的左边不存在大于等于a[i]的数,则把i存入l[]中 
		{
			l[i]=i;
		} 
		x.push(i);//把此时的i存入栈顶 
	} 
	//同理,完善r[],原理同上
	for(i=n;i>=1;i--)//这里要从后往前遍历,因为是找右边第一个大于等于他的数 
	{
		while(y.size() && a[y.top()]<a[i])
		{
			y.pop();
		}
		if(y.size())
		{
			r[i]=y.top();
		}
		else
		{
			r[i]=i;
		} 
		y.push(i);
	}
	/*此时对于任意i,i左边的第一个大于等于i的数坐标 到 i  和  
	i 到 i右边第一个大于等于i的数的坐标 都可以组成小组,
	我们取他们的最大值,逐一进行对比 ,得出结论*/
	int mmax=1,t;//初始化
	for(i=1;i<=n;i++)
	{
		t=max(i-l[i]+1,r[i]-i+1);
		mmax=max(mmax,t);
	}
	cout<<mmax;
	return 0;
 }


点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论