列表

详情


NC220346. B找山坡

描述

母牛哥在电脑面前坐久了,想站起来看看窗外的小山坡,于是就想出了这个问题:
给定一个大小为n的数组a,序号从1开始,

计算:

max{ R - L | 1 <= L <= R <= n, a[L] == a[R], 对于所有i (L <= i <= R), 满足a[i] >= a[L] }.
也就是找到两个坐标,这两个坐标的值相等,并且他们之间的值都大于等于这两个坐标上的值.
这两个坐标相减最大能是多少.

输入描述

第一行一个整数n,第二行n个整数

输出描述

输出题目所求的值

示例1

输入:

5
1 2 3 2 1

输出:

4

说明:

当L=1,R=5时,满足题目条件的最优解,答案为R-L=5-1=4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 1586ms, 内存消耗: 127248K, 提交时间: 2022-04-08 18:35:53

n = int(input())
a = [0 for i in range(n)]
s = input().split()
for i in range(n):
    a[i] = int(s[i])
b = []
ans = 0
for i in range(n):
    while len(b) > 0 and a[b[-1]] > a[i] :
        b.pop()
    if len(b) > 0 and a[b[-1]] == a[i] :
        ans = max(ans, i - b[-1])
    else:
        b.append(i)
print(ans)

C++(clang++11) 解法, 执行用时: 342ms, 内存消耗: 7580K, 提交时间: 2021-04-01 12:52:42

#include<bits/stdc++.h>
using namespace std;
int top=0,a[1000003],t[1000003],ans=0;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<=n;i++){
		while(top!=0&&a[i]<a[t[top]])top--;
		if(top!=0&&a[t[top]]==a[i])
		ans=max(ans,i-t[top]);
		else 
		t[++top]=i;
	}
	cout<<ans;
} 

上一题