[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]的更多相关文章

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

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

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

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

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

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

  4. 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 ...

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

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

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

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

  7. 【[USACO13NOV]没有找零No Change】

    其实我是点单调队列的标签进来的,之后看着题就懵逼了 于是就去题解里一翻,发现楼上楼下的题解说的都好有道理, f[j]表示一个再使用一个硬币就能到达i的某个之前状态,b[now]表示使用那个能使状态j变 ...

  8. [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)

    传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...

  9. [洛谷P3092]【[USACO13NOV]没有找零No Change】

    状压\(DP\) + 二分 考虑构成:\(k<=16\)所以根据\(k\)构造状压\(dp\),将所有硬币的使用情况进行状态压缩 考虑状态:数组\(dp[i]\)表示用\(i\)状态下的硬币可以 ...

随机推荐

  1. Asp.Net Core 2.0 之旅---在Ubuntu上部署WEB应用程序

    1.Ubuntu 上 安装NET Core 2.0 SDK 第一步的安装,微软大佬已经写的非常详细了=>直达链接,按照教程来即可. 2.将我们的WEB 发布到一个文件夹,将这个文件夹打包成 压缩 ...

  2. devexpress entity framework 与 asp.net mvc的坑

    最近在做一个使用ASP.NET MVC DEVEXPRESS和EF的OA模块 遇到不少问题这里记录一下: 1 如果项目中存在多个上下文类(DBContext的派生类),在做数据迁移的时候需要在不同目录 ...

  3. [求助][SPOJ MARIOGAM]-高斯消元(内含标程,数据等)

    小蒟蒻开始做概率的题之后,遇到了这道题,然而,他发现自己的程序调试了无数次也无法通过,系统总是返回令人伤心的WA, 于是,他决定把这一天半的时间收集到的资料放在网上, 寻求大家的帮助, 也可以节省后来 ...

  4. 利用Python爬取可用的代理IP

    前言 就以最近发现的一个免费代理IP网站为例:http://www.xicidaili.com/nn/.在使用的时候发现很多IP都用不了. 所以用Python写了个脚本,该脚本可以把能用的代理IP检测 ...

  5. [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...

  6. 一种解决eclipse中安装maven出错的方法

    1.安装步骤:https://jingyan.baidu.com/article/a17d5285feb4dd8099c8f26e.html 2.安装第三步的解决办法:m2e   路径换成  http ...

  7. HDU - 2181 dfs [kuangbin带你飞]专题二

    保存每个节点的下一个节点一直往下面走就行了,不能重复经过某个点,当经过的点达到20个而且当前节点的下一个节点是起点就打印答案. AC代码 #include<cstdio> #include ...

  8. session不会过期

    $(function () { window.setInterval(function () { $.post('random.html'); }, 60000); }); 加在母版页里,使用与长时间 ...

  9. openstack-ocata-环境准备1

    Openstack环境准备1. 最少两台机器2. Controller:1核cpu 4G内存 5G硬盘3. Computer:1核cpu 2G内存 10G硬盘4. 至少两个网卡,本次采用四个网卡(1网 ...

  10. MSQL的基准测试

    Mysql基准测试 基准测试 直接.简单.易于比较,用于评估服务器的处理能力 压力测试 对真实的月数据进行测试,获得真是系统所能承受的压力 基准测试的目的 1.建立MySQL服务器的性能基准线 2.模 ...