CF1554A Cherry 题解

是一道有显然的贪心策略的题,建议难度评为普及-

简化题意,即为求 \(\max(a_l,a_{l+1},\cdots,a_r)\times\min(a_l,a_{l+1},\cdots,a_r)\)

不妨从特殊的 \(a_i\)​​​ 考虑。如果 \(a_i\)​ 就是最大值,那么 \(a_{i+1}\geqslant\min(a_l,a_{l+1},\cdots,a_r)\)​​​​​​​​​​,则删去其余所有元素对结果不会有更劣的影响,\(a_{i+1}\)​​ 为最大值时同理。

如果最小值在 \(a_i\)​​​ 或 \(a_{i+1}\)​​ 处取得,最大值在 \(a_{i+2}\)​​ 取得,那么我们在考虑 \(a_{i+1}\)​ 与 \(a_{i+2}\)​ 这个情况的时候不会对答案有更劣影响。

所以逐步比较 \(\max(a_i\times a_{i+1})\times\min(a_i\times a_{i+1})\) 即可。

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define ri register int
#define il inline

const int INF=0x7fffffff,N=1e5+10;
int T,n,ans;
int a[N];

il ll read(){
    ll x=0,y=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
            y=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';
        c=getchar();
    }
    return x*y;
}

signed main(){
    T=read();
    while(T--){
        n=read();
        ans=-INF;
        for(ri i=1;i<=n;i++){
            a[i]=read();
            ans=max(ans,a[i]*a[i-1]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
posted @ 2021-08-01 12:27  BFNewdawn  阅读(87)  评论(0)    收藏  举报