题目链接:​​Maximize The Beautiful Value​

题目大意:给你n个非递减的数,你可以将任意一个数放到它前面的位置,这个数至少得移动k步,问怎么放贡献值最大,贡献值为∑ni=1i∗ai

题目思路:要使贡献值最大,我们只能移动某个数到他前面的第k个位置,我们可以知道移动到k+1位置一定贡献减小,因为当我们移动到k位置时和移动到k+1位置时只有k+1位置的贡献从i*ai到(i+1)*ai,增加了ai,而移动的那个的贡献从(i+1)*aj到(i+1)*aj,有aj>ai,所以贡献一定减少,所以我们只需要移动到k步前就好,然后枚举每个数移动的贡献,算一下最大值就好,这里可以用两个前缀和处理,一个是i*ai,一个是(i+1)*ai

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 1e5+5;

ll t,n,k,a[maxn],sum1[maxn],sum2[maxn];

int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&k);
for(int i = 1;i <= n;i++)
scanf("%lld",&a[i]);
sum1[0] = 0;sum2[0] = 0;
for(int i = 1;i <= n;i++){
sum1[i] = sum1[i-1]+(a[i]*i);
sum2[i] = sum2[i-1]+(a[i]*(i+1));
}
ll ans = 0;
for(ll i = k+1;i <= n;i++){
ll tmp = 0;
tmp += sum1[i-k-1];
tmp += a[i]*(i-k);
tmp += sum1[n]-sum1[i];
tmp += sum2[i-1]-sum2[i-k-1];
ans = max(tmp,ans);
}
cout<<ans<<endl;
}
return 0;
}