codevs1260 快餐问题
题意:
一个套餐需要a个A,b个B,c个C。
你生产一个A需要t1,一个B需要t2,一个C需要t3时间。
你有n台机器。每台每天工作timei时间。
一件物品只能在一个机器上生产。
求你一天最多能生产多少套餐。
每天ABC产量上限是100,n<=10
解:
这个DP的状态表示真是奇怪..
有一种做法是设f[i][j][k][l]表示前i台机器生产j个A,k个B,l个C的最大套餐数量。
被我的 1 1 1 2 2 2 3 3 2 1 卡掉了,输出1,答案是0
还有一种做法是设f[i][j][k][l]表示前i台机器生产j个A,k个B,l个C的所需最少时间。
这是zbtrs提供的。我还没思考。但是直觉上感觉很不对劲....
最后是我用的,f[i][j][k]表示前i台机器生产j个A,k个B时所能生产的最多C数量。
一开始预处理出最大套餐值和最大ABC值。
转移就是枚举这一台/之前的机器生产了多少A和B,然后计算出C来。
注意,一开始的时候可能会从f[0][x][y]之类的不存在的状态转移过来。
解决方案是赋值为-1,特判。初值是f[0][0][0] = 0
有几个剪枝:第一个是这条生产线不能生产更多的A和B了,这时要break
还有就是这个状态的C已经满了,此时不用继续枚举转移了,直接出转移(goto flag)。
然后就把很吓人的时间复杂度剪下去了。
#include <cstdio>
#include <algorithm>
#include <cstring>
#define say(a) printf(#a); printf(" = %d \n", a)
const int N = ; int f[][N][N], time[N];
int a, b, c;
int t1, t2, t3; int main() {
int n;
scanf("%d%d%d", &a, &b, &c);
scanf("%d%d%d", &t1, &t2, &t3);
scanf("%d", &n);
int sum = , ans = ;
for(int i = ; i <= n; i++) {
scanf("%d", &time[i]);
sum += time[i];
}
int lm = sum / (a * t1 + b * t2 + c * t3);
int maxA = std::min(lm * a, );
int maxB = std::min(lm * b, );
int maxC = std::min(lm * c, ); memset(f, -, sizeof(f));
f[][][] = ;
for(int i = ; i <= n; i++) {
f[i][][] = ;
}
for(int i = ; i <= n; i++) {
for(int j = maxA; j >= ; j--) {
for(int k = maxB; k >= ; k--) {
/// get f[i][j][k]
for(int jj = j; jj >= ; jj--) {
for(int kk = k; kk >= ; kk--) {
if(time[i] < (j - jj) * t1 + (k - kk) * t2) {
goto flag;
}
if(f[i - ][jj][kk] == -) {
continue;
}
f[i][j][k] = std::max(f[i][j][k],
f[i - ][jj][kk] + (time[i] - (j - jj) * t1 - (k - kk) * t2) / t3);
if(f[i][j][k] >= maxC) {
goto flag;
}
}
}
flag:
int now = std::min(j / a, k / b);
now = std::min(now, f[i][j][k] / c);
ans = std::max(ans, now);
}
}
} printf("%d", ans);
return ;
}
AC代码
codevs的数据很弱。强数据在洛谷上。
codevs1260 快餐问题的更多相关文章
- DP擎天
DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ...
- 白条VS花呗,快餐式消费金融成巨头新战场
在这一次的国庆假期前,90后网红密子君吃空麦当劳事件引发了网友们的热议.短短半个小时,这位90后网红就吃光了25包薯条,随后又吃下两杯麦旋风,其疯狂举动引得四周食客纷纷围观拍照.那么,是什么刺激这位9 ...
- xsank的快餐 » Python simhash算法解决字符串相似问题
xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题
- 实现快餐配送页面jq
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>快 ...
- 8.3.2018 1 Quick and dirty 快而脏的快餐
Quick and dirty 快而脏的快餐 BEIJING 北京 Food delivery is a booming business. Waste is piling up, too 送餐 ...
- Tensorflow快餐教程(1) - 30行代码搞定手写识别
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/details ...
- 云栖社区 Tensorflow快餐教程
云栖社区 Tensorflow快餐教程(1) - 30行代码搞定手写识别:https://yq.aliyun.com/articles/582122云栖社区 Tensorflow快餐教程(2) - 标 ...
- 快餐问题(dp好题)
Peter最近在R市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由A个 汉堡,B个薯条和C个饮料组成.价格便宜.为了提高产量,Peter从著名的麦当劳公司引进了N条 生产线.所有的生 ...
- 从零开始学习jQuery (六) AJAX快餐
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 本篇文章讲解如何使用jQuery方便快捷的实现A ...
随机推荐
- 为什么js中要用void 0 代替undefined
这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...
- C程序运行时的内存分布
该篇博客是自己学习的总结,如果有哪里理解的不对的地方,希望大家可以指点. 一.C内存空间分布图 二.各内存区域详解 1.代码区(.text): 该区域主要存放二进制可执行文件. 2.数据区(.data ...
- Partition算法以及其应用详解下(Golang实现)
接前文,除了广泛使用在快速排序中.Partition算法还可以很容易的实现在无序序列中使用O(n)的时间复杂度查找kth(第k大(小)的数). 同样根据二分的思想,每完成一次Partition我们可以 ...
- Python自动化运维ansible从入门到精通
1. 下载安装 在windows下安装ansible:
- Delphi (Library Path Browsing Path)
首先要明白的一个概念是dcu文件 *.dcu是*.pas的编译后单元文件(Delphi Compiled Unit), 编译器把它和库文件连接起来就构成了可执行文件*.exe 或*.dll等,相当于C ...
- Python——进程队列
队列 先进先出 from multiprocessing import Queue q = Queue(5) #队列的大小 q.put(1) #放入内容 q.put(2) #放入内容 q.put(3) ...
- canvas图形绘制
前面的话 前面分别介绍了canvas的基础用法和进阶用法,本文将使用canvas的各种语法进行图形绘制 绘制线条 [绘制线条] 下面来尝试绘制一段线条 <canvas id="draw ...
- initial
摘自http://blog.csdn.net/liming0931/article/details/7039680 首先说说结构化过程语句,在verilog中有两种结构化的过程语句:initial语句 ...
- Codeforces Round #545 Div. 1自闭记
A:求出该行该列各有多少个比其小的取max,该行该列各有多少个比其大的取max,加起来即可. #include<iostream> #include<cstdio> #incl ...
- Chrome不安装插件实现页面长截图
1.打开需要截图的页面,按F12进入审查模式 或直接在页面右击鼠标右键-检查,打开如下窗口 2.在控制台中按下 ctrl+shift+p,弹出如下输入框 3.输入screen进行模糊查找,选择“Ca ...