题目传送门

可能是我退役/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的更多相关文章

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

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

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

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

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

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

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

  6. [USACO13NOV]没有找零No Change [TPLY]

    [USACO13NOV]没有找零No Change 题目链接 https://www.luogu.org/problemnew/show/3092 做题背景 FJ不是一个合格的消费者,不知法懂法用法, ...

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

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

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

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

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

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

随机推荐

  1. poj 1469 COURSES (二分图模板应用 【*模板】 )

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18454   Accepted: 7275 Descript ...

  2. Spring Boot2.0之整合JSP

    首先不建议整合JSP哈,spring boot 对jsp的支持力度不大.  内置tomcat不支持jsp. 注意:在创建项目时候一定是war类型的,而不是跟之前那个freemarker那种jar类型. ...

  3. Linux- Linux自带定时调度Crontab使用详解

    Linux自带定时调度Crontab使用详解 在Linux当中,有一个自带的任务调度功能crontab,它是针对每个用户,每个用户都可以调度自己的任务. 示例:每分钟执行一次,将时间写入到指定文件当中 ...

  4. python之menu

    只有主菜单没有二级菜单的例子: from tkinter import * root=Tk() root.wm_title('同济大学财务管理系统') menubar=Menu(root)#指定菜单实 ...

  5. 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破

    from:https://blog.csdn.net/qq_18425655/article/details/52326709   题目: 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破 ...

  6. Nginx中如何限制某个IP同一时间段的访问次数

    如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见 ...

  7. hdu1085Holding Bin-Laden Captive!组合问题

    题目连接 题目意思:有单位价值为1 2 5的三种硬币,分别给出他们的数量,求用这些硬币不能组成的最小的价值 解题思路:普通的母函数 普通的母函数: 利用母函数的思想可以解决很多组合问题,下面举例说明: ...

  8. DBSCAN 聚类分析

    DBSCANCLUSTER DBSCAN(Density-basedspatial clustering ofapplications with noise)Martin.Ester, Hans-Pe ...

  9. 机器学习:Selective Search for Object Recognition

    今天介绍 IJCV 2013 年的一篇文章,Selective Search for Object Recognition,这个是后面著名的DL架构 R-CNN 的基础,后续介绍 R-CNN 的时候, ...

  10. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...