题意:
给你一个长度为n的数组a,你需要找到区间[l,r]
(
l
<
r
)
(l<r)
(l<r)使得max(a[l:r])*min(a[l:r])最大,输出最大值
题解:
一开始看到这道题第一感觉就是笛卡尔树,但是想想这是A题,是笛卡尔树的可能性较小。于是通过理性分析,发现可以枚举每个值作为最大值,然后找最小值最大的区间。
那么就可以发现,如果当前的数作为最大值的时候,区间变得越大,最小值不会变大,且通常是变得更小。于是就发现,相邻两个数相乘一定是最优的。
有人可能会问了,区间扩大,最大值不是会变大吗,为什么确定当前是最大的?那么这种情况当前值就没有了意义,于是在后面的值作为最大值的时候,一定比当前更优,也就是会覆盖掉这种情况。
C++代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
ll a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
ll ans=0;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),ans=max(ans,a[i]*a[i-1]);
printf("%lld\n",ans);
}
return 0;
}
Python代码:
t=int(input())
while t>0:
t-=1
n=int(input());
a=list(map(int,input().split()))
ans=0
for i in range(1,n):
ans=max(ans,a[i]*a[i-1])
print(ans)