求不重叠区间总和最大值

例题链接: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-1R,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]);
	}
相关推荐
INGNIGHT3 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_839080543 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山3 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds4 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a187927218314 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx4 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_307779135 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
我是章汕呐5 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归
charliejohn6 小时前
计算机考研 408 数据结构 堆的插入与删除 堆排序
算法
老鱼说AI6 小时前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模