P3092 [USACO13NOV] No Change G 题解

传送门

题解

思路

看到 \(1\le k\le16\),我们想到状压DP。
以每枚硬币是否被使用为状态,对其进行枚举。
\(dp_i\) 表示状态 \(i\) 下最多能支付到第 \(dp_i\) 件商品,令 \(f_{i,j}\) 表示从第 \(i+1\) 个位置开始,第 \(j\) 枚硬币可以支付 \((i+1,f_{i,j}]\) 这一区间的商品。
于是可以知道:每个状态下最多能支付到的商品位置,是从它的前继状态最多能支付到的那件商品的下一件商品开始,使用新增加的那枚硬币,所能支付到的最后一件商品的位置。
结合转移方程理解这句话:

\[\Large dp_i=\max(f_{dp_{i\oplus2^j},j},\ i\&2^j=0) \]

写成代码形式:

if(i&(1<<j)==0) dp[i]=max(dp[i],f[dp[i^(1<<j)][j];

像这样。答案就是所有 \(dp_i\ge N\) 的状态中剩余钱数的最小值。
时间复杂度 \(O(NK\log N+2^KK)\),可以解决。

实现

首先需要预处理 \(f\) 数组。笔者使用二分,更优的做法是双指针,留给读者自行思考(绝对不是因为我不会)
在预处理过程中需要频繁查询区间和,因此可以预处理 \(c\) 数组的前缀和。

代码

#include <cstdio>
#define N 100005
int max(int x,int y) {return x>y?x:y;}
int k,n;
int a[20],c[N];
int f[N][20];		//(i,f[i][k]]
int dp[N];
int cnt(int x)		//没用的硬币求和
{int ret=0;for(int i=0;i<k;i++)if(!(x&(1<<i))) ret+=a[i];return ret;
}
int main()
{scanf("%d%d",&k,&n);for(int i=0;i<k;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&c[i]),c[i]+=c[i-1];for(int i=0;i<=n;i++)for(int j=0;j<k;j++){int lb=i,rb=n;while(lb<rb){int mid=lb+rb+1>>1;if(c[mid]-c[i]<=a[j]) lb=mid;else rb=mid-1;}f[i][j]=lb;}int maxc=-1;for(int i=0;i<(1<<k);i++){for(int j=0;j<k;j++)if(i&(1<<j))dp[i]=max(dp[i],f[dp[i^(1<<j)]][j]);if(dp[i]==n)maxc=max(maxc,cnt(i));}printf("%d",maxc);
}

\[\Huge End \]

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

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

相关文章

java基础Day8 异常

一、简单分类 三种类型的异常Exception:检查性异常:最具代表性的检查性异常是用户错误或者问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常:运行时异常是可能被程序员避免的异常。与…

《CPython Internals》读后感

一、 为什么选择这本书? Python 是本人工作中最常用的开发语言,为了加深对 Python 的理解,更好的掌握 Python 这门语言,所以想对 Python 解释器有所了解,看看是怎么使用C语言来实现Python的,以期达到对 Python语言的掌握达到精通的程度,。 关于 Python 解释器的书不多—…

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及,用户迫切需要将纸质文档快速、准确地转换成电子格式,以提高工作效率和信息管理的便捷性。同时,用户将文档扫描成电子版后,可以自行通过加密和访问控制提高电子文档的安全性,以满足法律和合规要求。 HarmonyOS SDK 场景化视觉服务(V…

Grafana快速入门指南上篇

一.Grafana安装 1.下载grafana我们课堂实验均以Grafana 9.X版本实验的,更高版也可以实验,但是部分插件可能兼容性不太友好。下载地址:https://grafana.com/grafana/download/9.5.212.安装grafana apt-get install -y adduser libfontconfig1 muslwget https://dl.grafana.com…

dvwa靶场-----靶场搭建

dvwa靶场-----靶场搭建 一.环境准备: 第一步:下载PHPstudy: 找到PHPstudy官网,下载windows版小皮面板,然后安装。官网下载地址:https://www.xp.cn/PHPstudy第二步:安装PHPstudy并配置环境: 安装好小皮面板后打开Apache和MySQL, 访问127.0.0.1得到如下界面就是建立成功二.DVWA…

API Hooking

一、介绍 API hook(钩取)是一种用来拦截和修改 API 函数行为的技术。它常用于调试、逆向工程和游戏作弊。API 钩取涉及用一个自定义版本替换 API 函数的原始实现,该自定义版本在调用原始函数之前或之后执行一些附加动作。这允许人们在不修改程序源代码的情况下修改其行为 。…

杨立昆谈 Deepseek:开源正在超越私有;SpeechGPT 2.0-preview:情景智能拟人化实时交互系统

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

【nginx】界面化管理Nginx站点的两种方式

前言 之前在文章🧲NginxUI:界面化管理Nginx的工具中简单介绍了NginxUI工具和搭建,本文则探讨怎么使用NginxUI来做界面化的站点管理。 使用docker启一个nginx-ui用于测试,启动命令: docker run -dit \--name=nginx-ui \--restart=always \-e TZ=Asia/Shanghai \-v /mnt/us…

20250127_C++高级编程

对象初始化1 类的4个常见的构造函数1.1 类对象初始化的3个函数1.1.1 默认构造函数 FunctionClass(int data = 10) :m_data(data) {cout << "FunctionClass(int)" << endl; }1.1.2 拷贝构造函数 FunctionClass::FunctionClass(const FunctionClass&…

vsCreator笔记_I/O控制

1, I/O接口端子说明 2, I/O接口功能分配 3, 以上为默认设置, 也可通过vsCreator环境设置\I/O端子设置 4, 输入信号接线示意图5, 输出信号接线示意图

Windows bat批处理读取文件增加行号

前言全局说明Windows bat批处理读取文件增加行号一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737 Microsoft Windows [版本 10.0.22631.4751]二、文件内容 2.1 来源文件内容 文件名:source.ini a bCdE2.2 批处理内容 文件名:line_num.bat @echo offset "INI_FILE…