T组样例
n个数和k(最少移动的次数)
非递减序列
求最少移动k步 F(N)最大的值
思路:
非递减序列说明是递增的,也就是最开始的F(N)是最大的,现在移动了还要保证最大,也就是移动最少的步数,k步,求和自然要想到前缀和
be记录原始序列的和
sum[]记录前缀和
now 记录现在的
ans取最大值
注意数据范围
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 1e5 + 10; int t,n,k,a[maxn],sum[maxn],be,ans; signed main(){ //freopen("in","r",stdin); ios::sync_with_stdio(0); cin >> t; while(t--){ cin >> n >> k; be = 0; for(int i = 1; i <= n; i++) { cin >> a[i]; sum[i] = sum[i - 1] + a[i]; be += i * a[i]; } ans = 0; for(int i = 1; i + k <= n; i++){ int now = be + sum[i + k - 1] - sum[i - 1] - a[i + k] * k; ans = max(ans,now); } cout << ans << endl; } return 0; }