题目大意:
题目传送门:https://ac.nowcoder.com/acm/contest/5086/A
给你一个非递减的数字序列和要移动的步数k,每个数字所在的位置对应它的权值(第一个数字的权值是1,第二个数字的权值是2……),注意这个权值只跟数字的位置有关,而跟数字本身无关。只能移动一个数字,向前移动k步,问怎么样移动能使得整个数字序列的加权和最大?这个最大值是多少?
题目分析:
题解思路参考牛客评论区
AC代码:
#include <bits/stdc++.h>
#define PI 3.141592653589793238462643383279
using namespace std;
typedef long long ll;
int main()
{
int t=0;
cin>>t;
int a[100010]={0};
ll sum[100010]={0};
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
ll tot=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
tot+=i*a[i];
}
for(int i=1;i<=n;i++)
{
if(i==1)
sum[i]=a[i];
else
sum[i]=sum[i-1]+a[i];
}
ll output=-10000000000000;
for(int i=k+1;i<=n;i++)
{
ll now=tot+(sum[i-1]-sum[i-1-k])-a[i]*k;
output=max(output,now);
}
printf("%lld\n",output);
}
return 0;
}