题目链接:Here

思路:区间求和问题可以想到一个常用算法。前缀和。区间 \([l,r]\) 的和可以用 \(sum_r - sum_l\) 方便求出

由于区间长度 \(k\) 已知,所以我们可以直接选择暴力枚举两个区间的起点然后利用前缀和快速求和。

具体细节如下:

直接从 \(k\) 出发,用 cnt 比较出 \(k\) 之前最大区间和,用 ans 比较出 \(k\) 之后的最大区间和

  • 时间复杂度:\(\mathcal{O}(N)\)

注意点:数据范围较大,注意使用 long long

using ll = long long;
using namespace std;
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int _;
for (cin >> _; _--;) {
int n, k;
cin >> n >> k;
vector<ll> a(n + 2);
for (int i = 1; i <= n; ++i) cin >> a[i], a[i] = a[i - 1] + a[i];
ll ans = -1e18, cnt = -1e18;
for (int i = k; i + k <= n; ++i) {
cnt = max(cnt, a[i] - a[i - k]);
ans = max(ans, cnt + a[i + k] - a[i]);
}
cout << ans << "\n";
}
return 0;
}

当然这道题不仅仅是枚举起点一种解法,也可以用线性 DP

在我们预处理完前缀和后,如何获得某个位置之和的最大区间呢?我们可用线性 \(DP\) 求得,设 \(f1_i\) 表示位置 \(i\) 之前的最大区间和,而 \(f2_i\) 表示 \(i\) 之后的最大区间和。

  • \(f1_i = max(f1_{i - 1} , sum_i - sum_{i - k})\)
  • \(f2_i = max(f2_{i + 1},sum_{i + k - 1} - sum_{i - 1})\)
using ll = long long;
using namespace std;
const int N = 2e5 + 10;
ll f1[N], f2[N];
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int _;
for (cin >> _; _--;) {
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
vector<ll> sum(n + 1, 0);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
sum[i] = a[i] + sum[i - 1];
}
memset(f1, -127, sizeof f1);
memset(f2, -127, sizeof f2);
for (int i = k; i <= n - k; ++i)
f1[i] = max(sum[i] - sum[i - k], f1[i - 1]);
for (int i = n - k + 1; i >= k + 1; --i)
f2[i] = max(sum[i + k - 1] - sum[i - 1], f2[i + 1]);
ll ans = -1e18; for (int i = k; i <= n - k; ++i)
ans = max(ans, f1[i] + f2[i + 1]);
cout << ans << "\n";
}
return 0;
}

最后是不是感觉代码二是代码一的详细版本?

本质上两个代码是一样的(代码一在空间上更优),这里只是稍微展开来。

【每日一题】3.数学考试 (前缀和,线性DP)的更多相关文章

  1. 【ACM算法竞赛日常训练】DAY2题解与分析【比赛】【数学考试】【简单瞎搞题】

    DAY2共三题: 比赛(概率) 数学考试(前缀和与思维) 简单瞎搞题(dp) 视频讲解:https://www.bilibili.com/video/BV1hP411o7RD/ 作者:Eriktse ...

  2. 【python】Leetcode每日一题-前缀树(Trie)

    [python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...

  3. NC15553 数学考试

    NC15553 数学考试 题目 题目描述 今天qwb要参加一个数学考试,这套试卷一共有 \(n\) 道题,每道题qwb能获得的分数为 \(a_i\) ,qwb并不打算把这些题全做完, 他想选总共 \( ...

  4. 2018年长沙理工大学第十三届程序设计竞赛 H数学考试

    链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 数学考试 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  5. 【剑指Offer】简单部分每日五题 - Day 1

    今天开始更新leetcode上<剑指Offer>的题解,先从简单难度开始.预计按下列顺序更新: 简单难度:每日5题 中等难度:每日3题 困难难度:每日1题 17 - 打印从1到最大的n位数 ...

  6. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

  7. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  8. 【python】Leetcode每日一题-笨阶乘

    [python]Leetcode每日一题-笨阶乘 [题目描述] 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 ...

  9. Java实习生常规技术面试题每日十题Java基础(八)

    目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...

  10. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

随机推荐

  1. JavaWeb项目练习(学生选课管理系统)三【登录功能】

    需求: 首页为用户登录页面,管理员,教师,学生三种角色用户登录后,进入相应的功能页. 在index.jsp文件里跳转到login.jsp页面,为了更好地书写 <%@ page contentTy ...

  2. 2023你需要使用的最佳VSCode扩展插件

    选择最佳的 Visual Studio Code(以下简称 VSCode) 扩展插件对于提高开发效率和改善编程体验非常重要. 下面将详细介绍一些广受欢迎且功能丰富的 VSCode 扩展插件,包括编辑器 ...

  3. excel怎么固定前几行前几列不滚动?

    在Excel中,如果你想固定前几行或前几列不滚动,可以通过以下几种方法来实现.详细的介绍如下: **固定前几行不滚动:** 1. 选择需要固定的行数.例如,如果你想要固定前3行,应该选中第4行的单元格 ...

  4. STM32外设:专用定时器 IWDG、WWDG、RTC

    主要外设: IWDG:Independent Watch DoG 独立看门狗 WWDG:Window Watch DoG 窗口看门狗 RTC: Real-Time Clock 实时时钟 IWDG 主要 ...

  5. [c/c++][考研复习笔记]内部排序篇学习笔记

    考研排序复习笔记 插入排序 #include<stdio.h> #include<stdlib.h> #define MaxSize 9 //折半插入排序 void ZBIns ...

  6. ez_curl【代码审计】

    ez_curl[代码审计][难度:4] 题目描述 代码审计类题目,附上代码: <?php highlight_file(__FILE__); $url = 'http://back-end:30 ...

  7. 若依vue启动报Error: error:0308010C:digital envelope routines::unsupported

    解决:若依vue启动报Error: error:0308010C:digital envelope routines::unsupported 1.描述: 问题产生原因是因为 node.js V17版 ...

  8. ElasticSearch之Index stats API

    获取指定索引的统计数据. 获取指定索引的全部统计数据,命令样例如下: curl -X GET "https://localhost:9200/testindex_001/_stats?pre ...

  9. java.time包中的类如何使用

    java.time包是在java8中引入的日期和时间处理API,提供了一组全新的类,用于更灵活.更强大的处理日期和时间. 常用用法 1.localDate 表示日期,不包含时间和时区信息 import ...

  10. 全国网络安全行业职业技能大赛云南省选拔赛 Misc 部分WP

    word_sercet 题目 我的解答: 加密文档,010打开图片发现密码 VVV_123.com 解压打开得到flag(注:flag原本是隐藏的,但我之前设置过隐藏文字自动显示,因此这里直接可以看到 ...