Codeforces.788C.The Great Mixing(bitset DP / BFS)
\(Description\)
有k种饮料,浓度Ai给出,求用最少的体积配成n/1000浓度的饮料。
\(Solution\)
根据题意有方程 (A1x1+A2x2+...+Anxn)/[(x1+x2+...+xn)1000] = x/1000
xi表示Ai选多少升(0<=xi).1000可以约掉.
这样带着带着选与不选不好考虑(我为什么会这么考虑。。太naive了)
ai表示选了ai浓度1L,则(a1+a2+...+am) = m*n
那么 ∑(ai-n) = 0 , -1000 <= ai-n <= 1000
于是1.可以以0为起点BFS,把每个(ai-n)作为一条边,直到(用最少的步数)再走到0
或是2.考虑DP,用f[i][sum]表示用iL是否得到sum
于是朴素的DP:
for(i=1; i<=1000; ++i)//可以证明最多只需要1000L
for(sum=-1000; sum<=1000; ++sum)//需要对sum加个偏移量
for(j=1; j<=k; ++j)
if(-1000<=sum-(a[j]-n)<=1000)
f[i][sum]|=f[i-1][sum-(a[j]-n)]
这仍然是O(n^3)的
可以把sum的一层循环用bitset压掉(f[i-1]左移a[j]位后再右移n位)。这个复杂度?O((n^3)/64)?
上面的证明(最多需要1kL): 假设要配x浓度,有a>x的浓度、b<x的浓度,有u(a-x)+v(b-x)=0
u=x-b, v=a-x时,就可以配成x,此时u+v = a-b <= 1000
ai只需考虑1000以内的即可
//31ms 5744KB
//被卡T了。。不得不加个特判
#include <cstdio>
#include <cctype>
#include <bitset>
#define gc() getchar()
const int N=1e6+5;
int n,k,cnt,A[N];
bool vis[1005];
std::bitset<2018> f[2];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
n=read(),k=read();
for(int tmp,i=1; i<=k; ++i)
if((tmp=read())<=1000) A[++cnt]=tmp,vis[tmp]=1;
f[1][1000]=1;
if(cnt<1000)
for(int now=1,las,i=1; i<=1000; ++i)
{
las=now, now^=1;
f[now].reset();
for(int j=1; j<=cnt; ++j)
f[now]|=(f[las]<<A[j])>>n;
if(f[now][1000]) {printf("%d",i); return 0;}
}
else
for(int now=1,las,i=1; i<=1000; ++i)
{
las=now, now^=1;
f[now].reset();
for(int j=0; j<=1000; ++j)
if(vis[j]) f[now]|=(f[las]<<j)>>n;
if(f[now][1000]) {printf("%d",i); return 0;}
}
printf("-1");
return 0;
}
Codeforces.788C.The Great Mixing(bitset DP / BFS)的更多相关文章
- Codeforces 788C The Great Mixing
The Great Mixing 化简一下公式后发现, 问题变成了, 取最少多少数能使其和为1, bitset优化一下背包就好啦. 题解中介绍了一种bfs的方法没, 感觉比较巧妙. #include& ...
- Codeforces 788C The Great Mixing(背包问题建模+bitset优化或BFS)
[题目链接] http://codeforces.com/problemset/problem/788/C [题目大意] 给出一些浓度的饮料,要求调出n/1000浓度的饮料,问最少需要多少升饮料 [题 ...
- Codeforces 789e The Great Mixing (bitset dp 数学)
Sasha and Kolya decided to get drunk with Coke, again. This time they have k types of Coke. i-th typ ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- Codeforces 755F PolandBall and Gifts bitset + 二进制优化多重背包
PolandBall and Gifts 转换成置换群后, 对于最大值我们很好处理. 对于最小值, 只跟若干个圈能否刚好组能 k 有关. 最直观的想法就是bitset优化背包, 直接搞肯定T掉. 我们 ...
- 洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs
正解:dp+bfs 解题报告: 传送门! 这题看起来很复杂的样子其实真的很复杂 但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血 而且保证自己不死只有一种操作 而 ...
- BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...
- BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs
BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
随机推荐
- php学习之mysqli的面向对象
// mySqlTool.php 封装好的工具类 <?php class SqlTool{ private $conn; private $host="localhost" ...
- 在docker中部署centos7镜像
本篇文章参考自: https://www.cnblogs.com/linjj/p/5606911.html https://blog.csdn.net/u012767761/article/detai ...
- Ex 6_21 最小点覆盖问题_第八次作业
子问题定义: 对于图中的每个结点,有两种状态,即属于最小点覆盖和不属于最小点覆盖,定义minSet[i][0]表示结点i属于点覆盖,并且以i为根的树的最小点覆盖的大小.minSet[i][1]表示点i ...
- 【ES】学习2-搜索
1.空搜索 返回所有索引下的所有文档 GET /_search 设置超时.timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接.在后台,其他的分片可能仍在执 ...
- confusion_matrix(混淆矩阵)
作者:十岁的小男孩 凡心所向,素履可往 目录 监督学习—混淆矩阵 是什么?有什么用?怎么用? 非监督学习—匹配矩阵 混淆矩阵 矩阵每一列代表预测值,每一行代表的是实际的类别.这个名字来源于它可以非常容 ...
- SPLAY,LCT学习笔记(三)
前两篇讲述了SPLAY模板操作,这一篇稍微介绍一下SPLAY的实际应用 (其实只有一道题,因为本蒟蒻就写了这一个) 例:bzoj 1014火星人prefix 由于本蒟蒻不会后缀数组,所以题目中给的提示 ...
- python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)
昨日内容回顾 外键的变种三种关系: 多对一: 左表的多 对右表一 成立 左边的一 对右表多 不成立 foreign key(从表的id) refreences 主表的(id) 多对多 建立第三张表(f ...
- ERP合同列表页面自动导航(三十二)
合同审核完成页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CRMC ...
- JavaScriptDom操作与高级应用(八)
一:Dom操作基础与高级应用 Node接口也定义了一些所有节点类型都包含的属性和方法.
- .NetCore下使用Prometheus实现系统监控和警报 (六)进阶Grafana集成自定义收集指标
Prometheus中包含了很多收集指标,那么我们怎来在Grafana中来使用呢? 接下来我们还是以之前自定义的来演示如图:我们在Prometheus中已经可以看到这个之前我们自定义的类型了 关于Gr ...