[USACO13NOV]没有找零No Change [TPLY]
[USACO13NOV]没有找零No Change
题目链接 https://www.luogu.org/problemnew/show/3092
做题背景
FJ不是一个合格的消费者,不知法懂法用法,不会拿起法律的武器维护消费者权益
做法
本题涉及的知识点:状态压缩,动态规划,二分答案。
注意物品是依次购买
首先是状态压缩:
压什么?我们注意到k<=16,那么就是压硬币使用集合
。
然后是动态规划:
怎么设状态?设dp[i]表示我们选硬币集合i(状压)从一号物品开始
最多能买的物品数。
怎么转移?从0开始枚举每一个可能的硬币集合i(状压)
找到每一个存在于使用集合i中的硬币
(例如在集合11001中1,2,5是存在于集合i中的)
然后从不包含该硬币的集合
中转移过来
(即11001从01001,10001,11000中转移过来)
再是二分答案:哪里需要二分答案?在转移过程中.我们需要找到利用硬币最多能买到的物品数
,枚举太耗时间,前缀和二分答案就可以加快速度了。
几点注意:
转移开long long
位运算优先级有点头疼,能打括号打括号
Ans设为-1,不能设为0因为可能存在正好一点不剩的最优解
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define RG register
#define rg register int
#define rc register char
#define ll long long
#define il inline
#define INF 2147483647
#define SZ 100001
using namespace std;
il int gi()
{
rg x=0,o=0;rc ch=getchar();
while(ch!='-'&&(ch<'0'||'9'<ch))ch=getchar();
if(ch=='-') o=1,ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return o?-x:x;
}
int k,n;
ll tot,Ans,a[SZ],sum[SZ],dp[65537],c[17];
// 查询一个数二进制中1的个数
il ll num(rg x)
{
RG ll cnt=0;
for(rg i=0;i<k;++i)
if((x>>i)&1)
cnt+=c[i+1];
return cnt;
}
//手写upperbound函数
il int Upper(ll *array,int size,ll key)
{
rg hd=1,len=size;
while(len>0)
{
rg mid=hd+(len>>1);
if(array[mid]>key) len>>=1;
else hd=mid+1,len=len-(len>>1)-1;
}
return hd;
}
// upper_bound
int main()
{
k=gi(),n=gi();
for(rg i=1;i<=k;++i) c[i]=gi(),tot+=c[i];
for(rg i=1;i<=n;++i) a[i]=gi(),sum[i]=sum[i-1]+a[i];
for(rg i=0;i<=(1<<k)-1;++i)
for(rg j=0;j<k;++j)
if((i>>j)&1)
{
ll tmp=(i^(1<<j));
tmp=Upper(sum,n,sum[dp[tmp]]+c[j+1]);
dp[i]=max(dp[i],tmp-1);
}
Ans=-1;
for(rg i=0;i<=(1<<k)-1;++i)
if(dp[i]==n)
Ans=max(Ans,tot-num(i));
printf("%lld",Ans);
return 0;
}
[USACO13NOV]没有找零No Change [TPLY]的更多相关文章
- 洛谷P3092 [USACO13NOV]没有找零No Change
P3092 [USACO13NOV]没有找零No Change 题目描述 Farmer John is at the market to purchase supplies for his farm. ...
- P3092 [USACO13NOV]没有找零No Change
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- 洛谷 P3092 [USACO13NOV]没有找零No Change
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- 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 ...
- P3092 [USACO13NOV]没有找零No Change 状压dp
这个题有点意思,其实不是特别难,但是不太好想...中间用二分找最大的可买长度就行了. 题干: 题目描述 Farmer John <= K <= ), each with value .., ...
- Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925
题目传送门 可能是我退役/NOIP前做的最后一道状压... 题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱. 注意到\(k<=16\),提示 ...
- 【[USACO13NOV]没有找零No Change】
其实我是点单调队列的标签进来的,之后看着题就懵逼了 于是就去题解里一翻,发现楼上楼下的题解说的都好有道理, f[j]表示一个再使用一个硬币就能到达i的某个之前状态,b[now]表示使用那个能使状态j变 ...
- [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)
传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...
- [洛谷P3092]【[USACO13NOV]没有找零No Change】
状压\(DP\) + 二分 考虑构成:\(k<=16\)所以根据\(k\)构造状压\(dp\),将所有硬币的使用情况进行状态压缩 考虑状态:数组\(dp[i]\)表示用\(i\)状态下的硬币可以 ...
随机推荐
- 从一个实例学习----FLASK-WTF
本案例通过实现一个注册页面的编写,来带你了解FLASK-WTF的运用. 主要功能为表单基础的功能--手机号码必须为11位数,且通过数据库查找不能有已经注册的了,密码要求输入两遍且必须一样,且所有内容不 ...
- 【Oracle】-初识PL/SQL
在最近的工作中要用到存储过程和函数,索性把PL/SQL整体的看一下.之前看过基本书和园子里的博文,在这里将所学简单总结. 一.基本语句 1.大小写 2.分隔符 -- : 3.引用字符串 -- ...
- mysql sql_cache缓存使用
有如下规则,如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之.这里"数据表更改"包括: INSERT, UPDATE, DELETE, TRUNCATE ...
- NFS工作原理
很多同学都知道NFS的使用场景,也知道如何配置和使用,但对NFS的工作原理了解的很少. NFS是C/S模式,首先要有一台服务端跑NFS服务,然后各个客户端直接挂载共享目录使用.NFS服务本身不会监听端 ...
- angular2-qrcode (转)
插件选择 angular2-qrcode npm install angular2-qrcode --savecnpm install angular2-qrcode --save 参考github ...
- Linux常见目录及其作用
在Linux操作系统中,所有文件和目录都被组织成一个以根节点开始的倒置的树状结构.如下图 系统一般以 / 来表示根目录.在根目录之下的可以是目录也可以是文件,而每一个目录中又可以包含子目录文件.如此反 ...
- C#委托与事件--后续补充
委托.事件补充 针对昨天文章 委托:让方法可以跟简单对象一样作为参数进行传递,也就是将方法作为参数进行封装. 方法:本质就是代码段 其实也好理解,目的就是为了封装,多态,既然简单对象如int i可以做 ...
- FFMpeg在Ubuntu上的安装和使用
在Ubuntu Server上编译FFmpeg FFmpeg是最流行的开源视频转码工具包,在Ubuntu上可以直接通过apt-get安装,但是默认的编码器不提供x264这些non-free的编码器,所 ...
- 一、Python介绍
Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言. 编程语言主要从以下几个角度为进行分类,编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言,每个分类代 ...
- 《android开发艺术探索》读书笔记(八)--WindowManager
接上篇<android开发艺术探索>读书笔记(七)--动画 No1: Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window是很简单的事,只需要通过Windo ...