CF855B

Marvolo Gaunt's Ring

题面翻译

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

然后给了n个数\(a_1,a_2...a_n(-1e9<=a_i<=1e9)\)

求找出三个数\(a_i,a_j,a_k(1<=i<=j<=k<=n)\)使得\(p\times a_i+q\times a_j+r\times a_k\)最大。

分析

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

  • 枚举中心点 \(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 @ 2024-03-29 13:26  afhuds  阅读(6)  评论(0编辑  收藏  举报