牛客算法周周练1
A. Maximize The Beautiful Value
题意:
给你一个单调不下降序列,每个位置的代价为,现在求让其中一个数往前移动
步后,使得
最大。
分析:
序列,则在移动之前,
假设我们将往前移动
步到
(前面)
所以相当于这一区间下标整体
,
下标变成了
的下标(下标
),其余不变
则原序列
变成了
发现原来序列中的代价未产生变化
而的代价变成了
相较于原来的
发现在原来的
的基础上,现在的
多加了
,于是可以用前缀和进行维护,然后在
移动到
的位置上,它的代价减少了
所以最终,我们暴力让每个数移动,用上前缀和,就可以用解决此题。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=1e5+5; int T,n,k; ll a[MAX_N],Sum[MAX_N],ans,maxn; int main(){ scanf("%d",&T); while(T--){ maxn=0,ans=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); Sum[i]=Sum[i-1]+a[i];//计算a[i]的前缀和 ans+=a[i]*i;//计算当前序列(运动之前)的美丽值 } for(int i=k+1;i<=n;i++){//枚举每个数往前移动K步 maxn=max(maxn,ans+Sum[i-1]-Sum[i-k-1]-a[i]*k); } printf("%lld\n",maxn); } return 0; }