题目链接: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. ${pageContext.request.contextPath}的理解和用法

    在做房产管理系统的时候用到了<from>标签的这个用法,这就来解释一下 ${pageContext.request.contextPath} 是JSP取得绝对路径的方法,等价于 ${pag ...

  2. C++学习笔记三:变量与数据类型(浮点型)

    1. 数据类型与所占内存大小 类型 大小 精度 注意 float 4 7   double 8 15 默认 long double 16 >double   精度就是有效数字. 2. 声明和初始 ...

  3. 数字孪生结合GIS系统为物流行业带来的改变

    随着全球物流业务不断扩张和发展,数字化转型成为当今物流行业的主要趋势.在这个数字化时代,数字孪生技术和地理信息系统(GIS)的结合,为物流行业带来了前所未有的机遇和挑战.这种融合将为物流企业提供更高效 ...

  4. Intellij IDE 对接SVN

    1.安装SVN(SVN安装包见附件) 注意安装时需要选择第二个选项进行安装 2.安装SVN中文包(见附件) 安装完成后随便找个文件夹右键确认SVN安装是否生效 3.Intellij IDE得Setti ...

  5. 酷表ChatExcel -北大出品免费自动处理表格工具

    酷表ChatExcel是通过文字聊天实现Excel的交互控制的AI辅助工具,期望通过对表输入需求即可得到处理后的数据(想起来很棒),减少额外的操作,辅助相关工作人员(会计,教师等)更简单的工作.Cha ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (168)-- 算法导论13.2 1题

    一.用go语言,写出 RIGHT-ROTATE 的伪代码. 文心一言: 在计算机科学中,右旋转(RIGHT-ROTATE)是一种常见的操作,通常用于数组或链表.以下是一个使用Go语言实现右旋转的伪代码 ...

  7. Ubuntu 下建立 eclipse 启动图标,解决ADT没有菜单栏问题(转载)

    原文地址 怎么在这应用程序里边建立图标$sudo gedit /usr/share/applications/Eclipse.desktop输入以下代码 [Desktop Entry]Name=Ecl ...

  8. linux文件和文件夹的筛选、查找及用户和组管理命令

    1.列出当前系统上所有已经登陆的用户的用户名, 注意:同一个用户登录多次,则只显示一次即可. 查看系统用户的命令为: (1)getent passwd 查看系统上的所有用户信息 (2)w 查看登录用户 ...

  9. RSA 加密算法

    RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用.RSA是由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...

  10. Rasa中的tracker_store和event_broker

      Rasa 中的 tracker_store 相对主流为 Redis,event_broker 相对主流为 RabbitMQ.后续为了研究学习直接将 tracker_store 和 event_br ...