HDU 4884 TIANKENG’s rice shop (模拟)
TIANKENG’s rice shop
题目链接:
http://acm.hust.edu.cn/vjudge/contest/123316#problem/J
Description
TIANKENG managers a pan fried rice shop. There are n kinds of fried rice numbered 1-n. TIANKENG will spend t time for once frying. Because the pan is so small, TIANKENG can fry k bowls of fried rice with same kind at most. Assuming that there are m customers coming to the shop, and we know the arriving time of each customer and the brand and number of the fried rice they need. Could you tell TIANKENG the departure time of every customer respectively? Pay attention that TIANKNEG will serve the customer who comes earlier and he will fry the rice as much as possible. Meanwhile, customers are in queue depending on their arriving time(the earlier they arrive, the more front they stand).
Input
The first line contains a positive integer T(T<=100), referring to T test cases.
For each test case, the first line has 4 positive integer n(1<=n<=1000), t(1<=t<=10), k(1<=k<=5), m(1<=m<=1000), then following m lines , each line has a time(the time format is hh:mm, 0<=hh<=23, 0<=mm<=59) and two positive integer id(1<=id<=n), num(1<=num<=10), which means the brand number of the fried rice and the number of the fried rice the customer needs.
Pay attention that two or more customers will not come to the shop at the same time, the arriving time of the customer will be ordered by the time(from early time to late time)
Output
For each test case print m lines, each line contains a time referring to the departure time of the customer. There is a blank line between two test cases.
Sample Input
3
2 1 4 2
08:00 1 5
09:00 2 1
2 5 4 3
08:00 1 4
08:01 2 2
08:02 2 2
2 5 4 2
08:00 1 1
08:04 1 1
Sample Output
08:02
09:01
08:05
08:10
08:10
08:05
08:10
题意:
有一个炒饭店:
有n种炒饭; 每次可以同时炒k个同类炒粉, 且耗时为t;
假设每次炒饭都会炒足k个(不管有没有有人要);
现有m个客人:记录每种产品最后一次制作的开始时间和该产品剩余的份数;
给出每个客人到达的时间; 需要的品种(一个人只要一种)和份数;
现在要求出每个客人的离开时间.
注意:
m个客人按照到点排序,依次供应每个客人.
若制作某次炒粉前,有多个客人已经到达并且需要同种炒粉,则可以同时制作;
对于样例2:制作品种2时,第3个客人已达到,则可以同时制作两人的;
对于样例3:制作第一个客人的炒饭(品种1)时,第二个客人还没有到达,所以不能提前制作.
题解:
直接模拟整个过程:
方便起见,将所有时间以分钟计数;(输出时注意处理hour>=24的情况)
假设每次炒饭都会炒足k个(不管有没有有人要);
记录每种产品最后一次制作的开始时间和该产品剩余的份数;
依次处理每个客人,对于客人i:
- 比较i达到时间和所需产品的最后制作时间,如果在制作之前就到达了,那么即可以将剩下的产品卖给他;
如果剩下的产品足够供应客人i,则不需要开始新的制作,此时客人i处理完毕; - 若剩下的产品不足以供应i(先将剩下的都给他),或者i的到达时间在最后一次制作之后(剩下的产品不能卖给他):
则需要开始新的制作;
注意:新的制作开始的时间不一定是当前到达的时间,而是max(上一次制作(任意产品)的结束时间,当前时间);
(所以每次新的制作都要更新结束时间) 
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define LL long long
#define eps 1e-8
#define maxn 1100
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
int n, t, k, m;
int start_time[maxn];
int last_num[maxn];
int ans[maxn];
int last_time;
int main(int argc, char const *argv[])
{
    //IN;
    int T;  scanf("%d", &T);
    while(T--)
    {
        memset(start_time, 0, sizeof(start_time));
        memset(last_num, 0, sizeof(last_num));
        memset(ans, -1, sizeof(ans));
        last_time = 0;
        scanf("%d %d %d %d", &n, &t, &k, &m);
        for(int i=1; i<=m; i++) {
            int t1,t2,type,num;
            scanf("%d:%d %d %d", &t1,&t2,&type,&num);
            int _time = t1 * 60 + t2;
            if(_time <= start_time[type] && last_num[type]) {
                //可以将剩下的卖给客人
                if(num <= last_num[type]) {
                    last_num[type] -= num;
                    ans[i] = start_time[type] + t;
                } else  {
                    num -= last_num[type];
                    last_num[type] = 0;
                }
            }
            if(ans[i] != -1) continue;
            int ci = num / k; if(num%k) ci++;
            start_time[type] = max(_time, last_time) + (ci-1)*t; //新制做的开始时间:max(_time, last_time);
            last_time = start_time[type] + t;
            last_num[type] = k*ci - num;
            ans[i] = last_time;
        }
        for(int i=1; i<=m; i++) {
            int hours = ans[i] / 60;
            hours %= 24;
            int mins = ans[i] % 60;
            printf("%02d:%02d\n", hours, mins);
        }
        //PE: 最后一个用例后不能输出回车.
        if(T) printf("\n");
    }
    return 0;
}
												
											HDU 4884 TIANKENG’s rice shop (模拟)的更多相关文章
- hdu 4884 TIANKENG’s rice shop(模拟)
		
# include <cstdio> # include <algorithm> # include <cstring> # include <cstdlib ...
 - HDU TIANKENG’s rice shop(模拟)
		
HDU 4884 TIANKENG's rice shop 题目链接 题意:模拟题.转一篇题意 思路:就模拟就可以.注意每次炒完之后就能够接单 代码: #include <cstdio> ...
 - 【HDOJ】4884 TIANKENG's rice shop
		
简单模拟,注意并不是完全按照FIFO的顺序.比如第i个人的id为k,那么就算第i+1人的id不为k,也会检查他后续的排队人是否有id为k的. #include <cstdio> #incl ...
 - TIANKENG’s rice shop
		
Problem Description TIANKENG managers a pan fried rice shop. There are n kinds of fried rice numbere ...
 - hdu 4885 TIANKENG’s travel(bfs)
		
题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...
 - hdu 4122 Alice's mooncake shop(单调队列)
		
题目链接:hdu 4122 Alice's mooncake shop 题意: 有n个订单和可以在m小时内制作月饼 接下来是n个订单的信息:需要在mon月,d日,year年,h小时交付订单r个月饼 接 ...
 - HDU 4883 TIANKENG’s restaurant Bestcoder 2-1(模拟)
		
TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/O ...
 - HDU 5102 The K-th Distance(模拟)
		
题意:输入一棵树,输出前k小的点对最短距离dis(i,j)的和. 模拟,官方题解说得很清楚了.不重复了. http://bestcoder.hdu.edu.cn/ 需要注意的是,复杂度要O(n+k), ...
 - HDU 5805 NanoApe Loves Sequence (模拟)
		
NanoApe Loves Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5805 Description NanoApe, the ...
 
随机推荐
- inand和emmc区别
			
简单来说:inand式sandisk公司做的一款符合emmc标准的一个emmc存储器! ----
 - [leetcode72]Edit Distance(dp)
			
题目链接:https://leetcode.com/problems/edit-distance/ 题意:求字符串的最短编辑距离,就是有三个操作,插入一个字符.删除一个字符.修改一个字符,最终让两个字 ...
 - git设置对比工具
			
windows下设置 beyond compare 3 为 git 的对比工具. 首先需要先安装 beyond compare 3 工具,切记需要安装安装版的,不要搞绿色版的. mac下使用 Kal ...
 - poj 2528 Mayor's posters(线段树)
			
题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...
 - 制作SM2证书
			
前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...
 - POJ 1088 滑雪【记忆化搜索】
			
题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径 记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已 ...
 - NoSQL 数据库系统对比
			
虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举. 但是NoSQL数据库之间的不同,远超过两 SQ ...
 - UVA 658 It's not a Bug, it's a Feature! (最短路,经典)
			
题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了: ...
 - python - pip 从已有的安装列表 安装
			
已经安装好的机器:sudo pip freeze > install_list.list 需要安装的机器:sudo pip install -r install_list.list
 - 通过js检测到iframe,使父窗口重定向到index	-----------???----------------------
			
通过js检测到iframe,使父窗口重定向到index -----------???---------------------- 如果本身已将在iframe中,那么重定向的页面应该直接添加到父级ifr ...