传送门

题解

思路

看到 \(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
\]

P3092 [USACO13NOV] No Change G 题解的更多相关文章

  1. 洛谷P3092 [USACO13NOV]没有找零No Change

    P3092 [USACO13NOV]没有找零No Change 题目描述 Farmer John is at the market to purchase supplies for his farm. ...

  2. 状压 DP:[USACO06NOV] Corn Fields,[USACO13NOV] No Change

    [USACO06NOV] Corn Fields (试题来源:Link ) 题目描述 Farmer John has purchased a lush new rectangular pasture ...

  3. 洛谷P3104 Counting Friends G 题解

    题目 [USACO14MAR]Counting Friends G 题解 这道题我们可以将 \((n+1)\) 个边依次去掉,然后分别判断去掉后是否能满足.注意到一点, \(n\) 个奶牛的朋友之和必 ...

  4. 洛谷P2115 Sabotage G 题解

    题目 [USACO14MAR]Sabotage G 题解 本蒟蒻又来了,这道题可以用二分答案来解决.我们可以设答案最小平均产奶量为 \(x \ (x \in[1,10000])\) .然后二分搜索 \ ...

  5. P3092 [USACO13NOV]没有找零No Change

    题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...

  6. 洛谷 P3092 [USACO13NOV]没有找零No Change

    题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...

  7. luogu P3092 [USACO13NOV]没有找零No Change

    题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...

  8. P3092 [USACO13NOV]没有找零No Change 状压dp

    这个题有点意思,其实不是特别难,但是不太好想...中间用二分找最大的可买长度就行了. 题干: 题目描述 Farmer John <= K <= ), each with value .., ...

  9. Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925

    题目传送门 可能是我退役/NOIP前做的最后一道状压... 题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱. 注意到\(k<=16\),提示 ...

  10. P2882 Face The Right Way G 题解

    题目 Farmer John has arranged his N \((1 ≤ N ≤ 5,000)\) cows in a row and many of them are facing forw ...

随机推荐

  1. Educational Codeforces Round 90 (Rated for Div2)

    Donut Shops 现在有两个超市,第一个超市的物品按件卖,每件商品的售价为\(a\)元:第二个超市的物品按箱卖,每箱有\(b\)件物品,每箱售价为\(c\)元,现在要让你买\(x\)和\(y\) ...

  2. Mybatis【3】-- Mybatis使用工具类读取配置文件以及从属性读取DB信息

    代码直接放在Github仓库[https://github.com/Damaer/Mybatis-Learning ],可直接运行,就不占篇幅了. 1.使用工具类获取sqlSession实例对象 在上 ...

  3. 全球最大分类广告商的Karpenter实践:减负运维、减少中断、每月省21万(上)

    原文链接: https://medium.com/adevinta-tech-blog/the-karpenter-effect-redefining-our-kubernetes-operation ...

  4. 基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件

    前言 在软件开发过程中,尤其是在处理跨平台或来自不同来源的项目时,文件的编码格式往往会成为一个不可忽视的问题.不同的操作系统.编程语言和编辑器可能对文件编码有不同的支持和默认设置,这可能导致在打开一个 ...

  5. 借助AI助手分析LlamaIndex的工作流可视化

    接续上次的讨论,我们上次主要分析了LlamaIndex工作流的核心流程,当前还剩下一行代码需要关注,那就是关于工作流的可视化.今天我们的目标是深入理解这一可视化部分的主要流程,并且对其大体的实现方式进 ...

  6. 攻防世界:Web习题之 get_post

    攻防世界:Web习题之 get_post 题目内容 https://adworld.xctf.org.cn/challenges/list 题目首先需要我们用GET方式提交一个名为a,值为1的变量: ...

  7. 解读GaussDB的BTree索引和UBTree索引,如何带来更强并发能力

    本文分享自华为云社区<[GaussTech技术专栏]GaussDB的BTree索引和UBTree索引>,作者:GaussDB 数据库. 1. 简介 数据库通常使用索引来提高业务查询的速度. ...

  8. 【C#】【平时作业】习题-3-数组

    1. 设计一个数组用于存放10个整数,然后计算这十个整数之和? private void btn1_Click(object sender, EventArgs e) { int temp = 0; ...

  9. Qt编写机器码秘钥控制/日期防篡改/离线使用/硬件标识/运行时间/数量控制/批量更新秘钥

    一.前言说明 搞软件开发一直追求精益求精的目标,从第一版的秘钥生成器到今天这个版本,经历了十年的时间,最初的版本做的非常简陋,就是搞了个异或加密,控制运行时间,后面又增加设备数量的控制,然后就是到期时 ...

  10. IntelliJ IDEA打开Spring Booot项目并使用Maven导入依赖包时提示错误:Cannot resolve com.gexin.platform:gexin-rp-sdk-http:4.1.0.5

    构建项目时报错:  Cannot resolve com.gexin.platform:gexin-rp-sdk-http:4.1.1.4 gexin-rp-sdk-http:jar:4.1.1.4总 ...