Luogu_P10977(AcWing_299) Cut the Sequence 题解

news/2024/9/25 19:15:43/文章来源:https://www.cnblogs.com/cyf1208/p/18432002

解题思路

考虑线性 dp。

首先如果存在 \(a_i>m\),那肯定不满足条件,输出 \(-1\)

\(f_i\) 表示前 \(i\) 个数分成若干段,然后每段最大数之和,其中每段内的整数之和不超过 \(m\)

\(f_i\) 肯定是由 \(f_j\)\(1\le j<i\))转移过来的,也就是前 \(j\) 个数分好后再加上 \((j,i]\) 这一段,所以 \((j,i]\) 这一段需要满足 \(\sum\limits_{k=j+1}^{i}a_k\le m\),所以 \(j\) 就可以从 \(i-1\)\(1\) 倒序枚举。

继而有转移方程:

\[f_i=\min_{j=1}^{i-1}\left\{\left[\sum_{k=j+1}^ia_k\le m\right]\times\max_{k=j+1}^i\left\{a_k\right\}\right\} \]

时间复杂度为 \(\mathcal{O}(n^2)\),得分 \(24\text{pts}\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, a[N], f[N];
int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; i++) {cin >> a[i];}memset(f, 0x3f, sizeof(f));f[0] = 0, f[1] = a[1];for(int i = 2; i <= n; i++) {int maxi = -1, sum = 0;for(int j = i - 1; j >= 1 && sum + a[j] <= m; j--) {sum += a[j];maxi = max(maxi, a[j + 1]);f[i] = min(f[i], f[j] + maxi);}}cout << f[n];return 0;
}

接着讲正解,单调队列优化 dp。

区间和可以用前缀和处理。

注意到 \(j\) 最小的时候满足 \(\sum\limits_{k=j+1}^ia_k\le m\),也就是说 \(\sum\limits_{k=j}^ia_k>m\),这个数可以单独处理,而 \(t=\max\limits_{k=j+1}^i\left\{a_k\right\}\) 可以通过单调队列存一个单调递减的最大值数列,但因为最后答案 \(f_j+t\) 不具有单调性,所以需要再存一个小根堆,建议用 multiset,因为每次删除时优先队列不好删除。

时间复杂度为 \(\mathcal{O}(n\log_2n)\)

AC 代码,请勿抄袭

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, a[N], sum[N], f[N];
deque<int> dq;
multiset<int> s;
int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;bool flag = 0;for(int i = 1; i <= n; i++) {cin >> a[i];flag |= (a[i] > m);sum[i] = sum[i - 1] + a[i];}if(flag) { return cout << "-1", 0; }int p = 0;for(int i = 1; i <= n; i++) {while(sum[i] - sum[p] > m) { ++p; }while(!dq.empty() && dq.front() <= p) {int tmp = dq.front();dq.pop_front();if(!dq.empty()) { s.erase(f[tmp] + a[dq.front()]); }}while(!dq.empty() && a[dq.back()] <= a[i]) {int tmp = dq.back();dq.pop_back();if(!dq.empty()) { s.erase(f[dq.back()] + a[tmp]); }}int tmp = (!dq.empty() ? dq.back() : 0);dq.push_back(i);f[i] = f[p] + a[dq.front()];if(dq.size() > 1) {s.insert(f[tmp] + a[i]);f[i] = min(f[i], *s.begin());}}cout << f[n];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mini-lsm通关笔记Week2Overview

Week 2 Overview: Compaction and Persistence在上周,您已经实现了LSM存储引擎的所有必要结构,并且您的存储引擎已经支持读写接口。在本周中,我们将深入探讨SST文件的磁盘组织,并研究在系统中实现性能和成本效益的最佳方法。我们将花4天时间学习不同的compaction策略,从最…

001-什么是VOQ

1、什么是VOQ(Virtual Output Queues)? VOQ(虚拟输出序列)是一种存储结构,由FIFO与RAM以及逻辑结构组合构成。在一些数据应用场景中能够有效存储数据并且能够及时输出,避免阻塞。一句话来说VOQ的优点在于:共享存储,较少存储资源,避免数据阻塞,提高数据输出效率。 2、…

pl/sql小技巧

pl/sql中文乱码 select userenv(language) from dual cmd命令行 set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK pl/sql拖到cmd窗口下执行 pl/sql 显示行号pl、sql字体大小调整

结对项目-四则运算

github链接这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 实现四则运算自动生成程序,结对协作开发姓名 学号柳浩 3122004444洪吉潮PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 20 25Esti…

基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索

一、Sentinel简介 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: •丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、…

信息学奥赛复赛复习03-CSP-J2019-03-纪念品-背包、01背包、完全背包

PDF文档公众号回复关键字:202409251 2019 CSP-J 题目3 纪念品 [题目描述] 小伟突然获得一种超能力,他知道未来 T天 N 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量 每天,小伟可以进行以下两种交易无限次:任…

《DNK210使用指南 -CanMV版 V1.0》第二十六章 摄像头图像捕获实验

第二十六章 摄像头图像捕获实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k…

实时网络的仿真和配置工具RTaW Pegase v4.6版本更新

01概述随着嵌入式系统日益复杂,高效可靠的设计工具变得愈发重要。RTaW公司的仿真工具RTaW-Pegase最新发布的4.6版本,为用户带来了一系列重要更新和功能增强。本文将详细介绍RTaW-Pegase v4.6版本的主要更新内容,涵盖了DDS、SOME/IP、Ethernet、CAN以及SDV等多个关键领域的改…

CTFSHOW pwn03 WrriteUp

本文来自一个初学CTF的小白,如有任何问题请大佬们指教! 题目来源 CTFShow pwn - pwn03 (ret2libc) https://ctf.show/challenges 思路 1.下载题目放到checksec先查一下2.IDA打开题目Shift + F12查看字符串发现没有system和/bin/sh,但是有libc文件。 3.用gdb的cyclic查询一…

如何正确的在项目中接入微信JS-SDK

微信JS-SDK的功能 如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系…

kafka的安装与配置

kafka的安装与配置 kafka的安装 在这我才用的是oracle云,系统是Ubuntu,在docker上按照的 安装docker 具体的安装方法请见docker-compose教程 查看docker版本 docker --versionDocker version 27.0.3, build 7d4bcd8创建 Docker Compose 文件 Kafka 依赖 Zookeeper 来管理集群…