CF855B

Marvolo Gaunt's Ring

题面翻译

给了三个数: p,q,r(1e9<=p,q,r<=1e9)

然后给了n个数a1,a2...an(1e9<=ai<=1e9)

求找出三个数ai,aj,ak(1<=i<=j<=k<=n)使得p×ai+q×aj+r×ak最大。

分析

这是一道十分简单的“三元组”问题,套路很简单:

  • 枚举中心点 j, O(1) 找到最大的 i,j
    对于这一道题目,需要处理前缀最大值和后缀最大值即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5;

int n, p, q, r, ans = LONG_LONG_MIN;

int a[N], mxf[N], mxb[N];

signed main(){
    
    cin >> n >> p >> q >> r;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    
    mxb[n + 1] = mxf[0] = -1e18 - 1;
    
    for (int i = 1; i <= n; i++)
        mxf[i] = max(mxf[i - 1], a[i] * p);
    
    for (int i = n; i >= 1; i--)
        mxb[i] = max(mxb[i + 1], a[i] * r);
    
    for (int i = 1; i <= n; i++)
        ans = max(ans, mxf[i] + a[i] * q + mxb[i]);
    
    cout << ans;
    
    return 0;
}

Written with StackEdit中文版.

posted @   afhuds  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示