第十五届蓝桥杯省赛第二场C/C++B组G题【最强小队】题解

经过分析发现和力扣的 42. 接雨水 非常像(觉得挺新奇的,特此记录下),只不过一个是计算容量,一个是计算宽度,直接借鉴前后缀两次遍历的思路,找出各个符合条件的队伍,最后选出最长的。

(代码随便写的,新手勿喷)

时间复杂度:O(n)

空间复杂度:O(n)
 

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;


int main(void)
{
	int n;
	cin >> n;
	vector<int> a(n+3);
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	
	if (n <= 2)
	{
		cout << n;
		return 0;
	}
	
	int ans = 2;
	vector<int> pre_max(n+3), suf_max(n+3);
	
	pre_max[1] = a[1];
	for (int i = 2; i <= n; i++)
		pre_max[i] = max(pre_max[i-1], a[i]);
	
	suf_max[n] = a[n];
	for (int i = n-1; i >= 1; i--)
		suf_max[i] = max(suf_max[i+1], a[i]);
	
	for (int lp = 0, rp = 0; rp <= n; rp++)
	{
		if (min(pre_max[rp], suf_max[rp]) > a[rp])
			a[rp] = 1;
		else
			a[rp] = 0;
		
		if (a[rp] == a[lp])
		{
			if (rp == n && a[lp] == 1)
			{
				ans = max(ans, rp - lp + 1 + 2);
				break;
			}
			continue;
		}
		if (a[lp] == 1)
			ans = max(ans, rp - lp + 2);
		lp = rp;
	}
	cout << ans;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值