例题链接:1051-习题-数学考试_2021秋季算法入门班第一章习题:模拟、枚举、贪心
来源:牛客网
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld
题目描述
今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qwb并不打算把这些题全做完,
他想选总共2k道题来做,并且期望他能获得的分数尽可能的大,他准备选2个不连续的长度为k的区间,
即[L,L+1,L+2,....,L+k-1],[R,R+1,R+2,...,R+k-1](R >= L+k)。
输入描述:
第一行一个整数T(T<=10),代表有T组数据 接下来一行两个整数n,k,(2<=n<=200,000),(1<=k,2k <= n) 接下来一行n个整数a1,a2,...,an,(-100,000<=ai<=100,000)
输出描述:
输出一个整数,qwb能获得的最大分数
示例1
输入
复制2 6 3 1 1 1 1 1 1 8 2 -1 0 2 -1 -1 2 3 -1
2 6 3 1 1 1 1 1 1 8 2 -1 0 2 -1 -1 2 3 -1
输出
复制6 7
6 7
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{int n, k;cin >> n >> k;vector<int> a(n+1);for (int i = 1; i <= n; i++){cin >> a[i];a[i]+=a[i-1];}int l=-1e18, r=-1e18;for (int i = k; i <= n - k; i++){l = max(l, a[i] - a[i - k]);r = max(r, l+a[i+k]-a[i]);}cout << r << endl;
}
signed main()
{int t;cin>>t;while (t--){solve();}return 0;
}
代码:其中找这两个最大值只需要这样就好,会自动更新。
for (int i = k; i <= n - k; i++){l = max(l, a[i] - a[i - k]);r = max(r, l+a[i+k]-a[i]);}