題目:
樣例:
題目大意:
給出一個單調不遞減序列(只是說單調不遞減哦),而後給一個 K ,可使得數列中的一個數向前移動 K 步,
其餘的依次向後移動,最後使得 1 * a[1] + 2 * a[2] + 3 * a[3] + ..... + a[n] 最大(移動後)。
析題得侃:
剛開始看樣例一位只要 將最後一位向前移動 K 步就 ok 了,交了一發,哈哈,wa 的可伶,
其實這樣是確定不行的,試想這樣一個樣例: 1 1 1 1 2 2
K = 3,這樣的話是知足單調不遞減的,可是若是咱們將最後一位向前移動 K 步的話,顯然咱們獲得的值不是最大的。
咱們只須要將前面的 1 向前移動 K 步便可。
考察點:
貪心、前綴和、思惟
圖解:
Code:
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
typedef long long LL;
LL a[maxn];
LL pre[maxn];
LL res = 0,ans = 0;
int t,n,k;
int main(void) {
scanf("%d",&t);
while(t --) {
res = 0,ans = 0;
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i ++) {
scanf("%d",&a[i]);
// 總和
ans += a[i] * i;
// 前綴和
pre[i] = pre[i - 1] + a[i];
}
res = 0;
for(int i = k + 1; i <= n; i ++) {
// 每一個 A【i】只能向前移動 K 步
res = max(res,ans + (pre[i - 1] - pre[i - k - 1]) - a[i] * k);
}
printf("%lld\n",res);
}
return 0;
}
客官留步:
思惟真的是個奇妙的東西。
先看一下限制範圍,猜一下大概會用到什麼算法,經過題目去推測信息顯得尤其重要,
咱們在作一個選擇的時候應該想一想會形成什麼影響。