Codeforces 1554 A. Cherry —— 贪心(双语)

This way

题意:

给你一个长度为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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值