牛客算法周周练1 A. Maximize The Beautiful Value(前缀和)
题目链接:https://ac.nowcoder.com/acm/contest/5086/A
题意
有一个大小为 $n$ 的数组,定义 $F(n) = \sum_{i = 1}^{n} i \times a_i$,可以将数组中的一个数向前移 $k$ 位,问 $F(n)$ 的最大值。
题解
先算出初始时的 $F(n) = \sum_{i = 1}^{n} i \times a_i$,之后从第 $k + 1$ 个数开始枚举向前移 $k$ 位给原 $F(n)$ 带来的变化,即 $F(n) - k \times a_i + pre_{i - 1} - pre_{i - 1- k}$ 。
代码
#include <bits/stdc++.h> using ll = long long; using namespace std; const int N = 1e5 + 100; ll a[N], pre[N]; void solve() { int n, k; cin >> n >> k; ll sum = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; sum += i * a[i]; pre[i] = pre[i - 1] + a[i]; } ll ans = 0; for (int i = k + 1; i <= n; i++) ans = max(ans, sum - k * a[i] + pre[i - 1] - pre[i - 1 - k]); cout << ans << "\n"; } int main() { int t; cin >> t; while (t--) solve(); }

浙公网安备 33010602011771号