求不重叠区间总和最大值

例题链接: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]);
	}
相关推荐
苏纪云30 分钟前
算法<java>——排序(冒泡、插入、选择、归并、快速、计数、堆、桶、基数)
java·开发语言·算法
滋滋不吱吱31 分钟前
栈的进阶篇
数据结构·算法·leetcode
YQ_ZJH40 分钟前
Java List列表创建方法大总结
java·开发语言·数据结构·算法·list
Absinthe_苦艾酒1 小时前
golang基础语法(五)切片
开发语言·算法·golang
Rsingstarzengjx1 小时前
【算法】【数学】【质数】质数相关 leetcode 204
数据结构·算法
一碗白开水一1 小时前
【第29话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明
人工智能·算法·机器学习·计算机视觉·自动驾驶·unix
小欣加油1 小时前
leetcode 98 验证二叉搜索树
c++·算法·leetcode·职场和发展
koping_wu2 小时前
【分布式】分布式ID生成方案、接口幂等、一致性哈希
分布式·算法·哈希算法
windliang2 小时前
一文入门 agent:从理论到代码实战
前端·算法
CoovallyAIHub2 小时前
华为发布开源超节点架构,以开放战略叩响AI算力生态变局
算法·架构·github