解题思路:
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; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复