牛客算法周周练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;
}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务