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; }