Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925
可能是我退役/NOIP前做的最后一道状压...
题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱。
注意到\(k<=16\),提示状压。开始设计的状态是\(f[i]\)表示在状态\(i\)下最多剩的钱数,后来发现不好搞因为可能有无解的情况。这种情况我们不妨把状态设计的再“退化”一点,也就是不那么贴近最终的结果,只是一个中间的部分。设\(f[i]\)为在状态\(i\)下,最多能购买的物品数。
因为是按顺序购买的,所以有一定的单调性(单调递增)。我们在转移的时候考虑从哪些状态转移到当前状态,还是异或得到子集的思路来转移,但是我们更新的是买的物品数,每次暴力查的话可能会是复杂度再累乘一个\(O(n)\)然后爆炸。刚才我们说到单调性,可以利用这个性质帮助求解,用一个\(upperbound\)就能把复杂度降到\(O(2^k*k*log)\)。
设用二分找到的这个位置为\(pos\),那么我们的转移方程就是\(f[i]=max(f[i],pos-1)\)。每次当我们的状态能买\(n\)个时,就更新下答案。最后判无解的时候看需求是否大于供给。另外下标最好都从0开始搞...。(WA了一次)
总之一道二分+状压好题~(逃)
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int k,n,fake;
int f[70000];
ll tot,ans=1e20,sum[100090],val[20];
int main()
{
freopen("1.in","r",stdin);
scanf("%d%d",&k,&n);
fake=(1<<k)-1;
for(int i=0;i<k;i++) scanf("%lld",&val[i]),tot+=val[i];
for(int i=1,x=0;i<=n;i++)
scanf("%d",&x),sum[i]=sum[i-1]+x;
for(int i=0;i<=fake;i++)
{
for(int j=0;j<k;j++)
{
if(i&(1<<j))
{
ll fi=sum[f[i^(1<<j)]]+val[j];
int pos=upper_bound(sum+1,sum+1+n,fi)-sum;
f[i]=max(f[i],pos-1);
}
}
if(f[i]==n)
{
ll tmp=0;
for(int j=0;j<k;j++)
if(i&(1<<j)) tmp+=val[j];
ans=min(ans,tmp);
}
}
if(ans>tot) printf("-1\n");
else printf("%lld\n",tot-ans);
return 0;
}
Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925的更多相关文章
- P3092 [USACO13NOV]没有找零No Change 状压dp
这个题有点意思,其实不是特别难,但是不太好想...中间用二分找最大的可买长度就行了. 题干: 题目描述 Farmer John <= K <= ), each with value .., ...
- 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
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 ...
- [USACO13NOV]没有找零No Change [TPLY]
[USACO13NOV]没有找零No Change 题目链接 https://www.luogu.org/problemnew/show/3092 做题背景 FJ不是一个合格的消费者,不知法懂法用法, ...
- [洛谷P3092]【[USACO13NOV]没有找零No Change】
状压\(DP\) + 二分 考虑构成:\(k<=16\)所以根据\(k\)构造状压\(dp\),将所有硬币的使用情况进行状态压缩 考虑状态:数组\(dp[i]\)表示用\(i\)状态下的硬币可以 ...
- 【[USACO13NOV]没有找零No Change】
其实我是点单调队列的标签进来的,之后看着题就懵逼了 于是就去题解里一翻,发现楼上楼下的题解说的都好有道理, f[j]表示一个再使用一个硬币就能到达i的某个之前状态,b[now]表示使用那个能使状态j变 ...
- [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)
传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...
随机推荐
- 多线程(一) NSThread
OS中多线程的实现方案: 技术 语言 线程生命周期 使用频率 pthread C 程序员自行管理 几乎不用 NSthread OC 程序员自行管理 偶尔使用 GCD C 自动管理 经常使用 NSOpe ...
- 图形绘制处理逻辑VC
// 逻辑1:先从资源中读取背景资源,然后将绘图对象与DC绑定,通过绘图对象绘出背景 // 逻辑2:先从资源中读取背景资源,新建一个MEMDC,将绘图对象与MEMDC绑定,并且 // 通过绘图对象在内 ...
- POJ2104 K-th Number —— 静态区间第k小
题目链接:http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Sub ...
- jQuery选项卡tabulous
jQuery选项卡tabulous,jQuery,选项卡,tab标签切换代码,扁平设计,jQuery选项卡tabulous是一款支持Scale.Slide.Scale Up.Flip等效果jquery ...
- tensorflow实现svm多分类 iris 3分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)
# Multi-class (Nonlinear) SVM Example # # This function wll illustrate how to # implement the gaussi ...
- Java内部类复习
package com.t_06; import org.junit.Test; import com.t_06.StaticClass.StaticInnerClass; /** * 一个类的定义放 ...
- HihoCoder1651 : 小球染色([Offer收割]编程练习赛38)(DP的优化)
描述 小Ho面前有N个小球排成了一排.每个小球可以被染成M种颜色之一. 为了增强视觉效果,小Ho希望不存在连续K个或者K个以上的小球颜色一样. 你能帮小Ho计算出一共有多少种不同的染色方法么? 例如N ...
- js 图片上传
可能很多不熟悉的图片上传的同学会觉得有点懵,其实做过一次你就会发现特别的简单. 只是一个formData格式的表单提交,把地址写到 action = "" 里面就可以了,当然你可以 ...
- Poj_1011_Sticks(剪枝)
一.Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度. ...
- requests模拟上传照片
博客园相册管理中有上传照片的功能 现在通过requests库模拟上传图片功能 先手动上传图片,用Fiddler转包,查看到上传图片接口请求格式, ------WebKitFormBoundarySKZ ...