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$。
对于这一道题目,需要处理前缀最大值和后缀最大值即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #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中文版.