1017. Queueing at Bank (25)
2016-07-06 19:50
691 查看
目录
目录原题
思路
注意
代码
原题
1017. Queueing at Bank (25)思路
在读取客户时就把到达时间大于或等于17:01的客户去掉。设定一个队列,每当一个窗口出现空闲,而且队列里有人,就出队一个人。记录每一个人的到达时间和开始服务的时间、完成服务的时间。注意
此题和1014. Waiting in Line略有不同。那就是,17:00:00以及之前到达的顾客都可以得到服务,结束服务的时间=开始服务的时间+服务时间。而1014里,一到17:00:00所有顾客不管是正在服务的还是未曾服务的,都需要离开;对于在17:00:00之前未曾轮到的顾客(包括正好在17:00:00轮到的顾客)都需要输出sorry。不注意到这一点,此题最后的测试点无法通过。代码
#include <cstdio> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> #include <climits> #include <cstring> const int starttime = 8 * 3600; const int endtime = 17 * 3600; struct customer { int hour1, min1, sec1; int date1, date2, date3; int process; }; bool cmp(customer c1, customer c2); void process(std::vector<customer> &vec, int k); int main(void) { int n, k; setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20); scanf("%d %d", &n, &k); customer *windows = new customer[k]; customer temp; std::vector<customer> vec; int count = 0; for (int i = 0; i < n; i++) { scanf("%d:%d:%d %d", &temp.hour1, &temp.min1, &temp.sec1, &temp.process); temp.date1 = temp.hour1 * 3600 + temp.min1 * 60 + temp.sec1; temp.process = temp.process * 60 > 3600 ? 3600 : temp.process * 60; // No one can occupy the window for more than one hour if (temp.date1 <= endtime) { vec.push_back(temp); } } std::sort(vec.begin(), vec.end(), cmp); process(vec, k); int wait_time = 0; for (int i = 0; i < (int)vec.size(); i++) { wait_time += vec[i].date2 - vec[i].date1; } printf("%.1lf", wait_time / 60.0 / vec.size()); delete[] windows; return 0; } bool cmp(customer c1, customer c2) { return c1.date1 < c2.date1; } void process(std::vector<customer> &vec, int k) { customer *wid = new customer[k]; memset(wid, 0, sizeof(customer) * k); int time, i, nthwin; for (i = 0; i < (int)vec.size() && i < k; i++) { wid[i] = vec[i]; wid[i].date2 = starttime > wid[i].date1 ? starttime : wid[i].date1; wid[i].date3 = wid[i].date2 + wid[i].process; vec[i] = wid[i]; } for (; i < (int)vec.size(); i++) { time = INT_MAX; for (int j = 0; j < k; j++) { if (time >= wid[j].date3) { time = wid[j].date3; nthwin = j; } } vec[i].date2 = wid[nthwin].date3 > vec[i].date1 ? wid[nthwin].date3 : vec[i].date1; vec[i].date3 = vec[i].date2 + vec[i].process; // all customers will end their procession at the time of 17:00:00 wid[nthwin] = vec[i]; } delete[] wid; return; }
相关文章推荐
- 关于优先队列 priority_queue 的介绍及其应用
- 客户端窗口UI管理
- Codeforces Round #360 (Div. 2) E. The Values You Can Make
- Builder模式总结
- UEditor使用报错Cannot set property 'innerHTML' of undefined
- CSS3学习笔记2:UI元素状态伪类选择器
- [已解决]#1142 - SELECT command denied to user ''@'localhost' for table 'pma_table_uiprefs'
- android6.0 ueventd
- JUC源码分析18-队列-LinkedBlockingQueue
- EasyUi常用组件(三)Panel 控制面板
- Android单线程模型中Message、Handler、Message Queue、Looper之间的关系
- 拖动视图,DragShadowBuilder使用
- 推荐爱码哥移动开发平台十大常用的原生UI控件
- 关于easyUI在子页面增加显示tabs的一个问题
- UE4学习笔记(2)——streamingLevel
- vue-mobile - 一个基于VUE的UI框架
- ios开发 int,NSInteger,NSUInteger,NSNumber
- Java并发包:双端阻塞队列(BlockingDeque)
- LABjs、RequireJS、SeaJS 哪个最好用?为什么?
- UIViewContentMode,iOS图片排版