Maximize The Beautiful Value 前缀和

Maximize The Beautiful Value

https://ac.nowcoder.com/acm/contest/5086/A

题意:给出n个数字 和 k 问将一个数字(只要一个)向前移动至少k个单位 有变化的向后顺延 使得
图片说明 最大

思路:先预处理个前缀和 和 原始数组的答案 越往前面越小 为了保证答案最大只需要移动k位就好 然后从第k+1位开始枚举变化情况 因为每次移动在当前位置i 到 i - k区间内的数都会往后顺延1位 则加上他们的区间和 而当前位置向前移动了k位 所以要减去k对答案的贡献 过程中维护最大值就是答案

#include <bits/stdc++.h>

using namespace std;

#define LL long long
#define mes(x,a) memset(x,a,sizeof(x));
#define sca(a) scanf("%d",&a)
#define lowbit(x)  x & (-x)
#define fi first
#define se second
#define pii pair<int, int>

inline int read()
{
    int x=0,flag_read=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            flag_read=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    return x*flag_read;
}

const double eps=1e-9;
const double pi=acos(-1);
const int N = 1e5 + 5;
const int M = 1e7+5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;

int a[N];
LL sum[N];

int main()
{
    int t ;

    t = read();

    while(t --)
    {
        int n = read();
        int k = read();

        LL res = 0;
        for(int i = 1;i <= n;i ++)
            a[i] = read(),res += 1LL*a[i]*i;

        for(int i = 1;i <= n;i ++)
            sum[i] = sum[i - 1] + a[i];

        LL ans = -10000000000000;

        for(int i = k + 1;i <= n;i ++)
        {
            LL temp = res + (sum[i - 1] - sum[i - 1 - k]) - 1LL*a[i]*k;
            ans = max(ans,temp);
        }

        printf("%lld\n",ans);
    }
    return 0;
}
全部评论

相关推荐

拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务