牛客算法周周练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();
}

 

posted @ 2020-05-30 20:25  Kanoon  阅读(190)  评论(0)    收藏  举报