[刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级。为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次。现知道每个话题前来咨询的时间、间隔、处理此话题所需的时长与一共有多少次咨询。问多少时间后全部话题处理完成。
代码:(Accepted,0.010s)
//UVa822 - Queue and A
//Accepted 0.010s
//#define _XIENAOBAN_
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<map>
#define MI 2147483647
using namespace std;
struct T {
int ti; //time for per task
queue<int> table;
} ttmp;
struct P {
int id, at, st, n, to[22];//identity, available time, start time of last task, number of topics, topics
bool operator< (const P& that) const {
if (st != that.st) return st < that.st;
return id < that.id;
}
} ptmp;
int Tpc, Psnl;//Number of Topics & Personnel
int name, num, nt, to, Scenario(0);
int main()
{
#ifdef _XIENAOBAN_
#define gets(T) gets_s(T, 80)
freopen("in.txt", "r", stdin);
#endif
ptmp.at = 0;
while (scanf("%d", &Tpc) != EOF && Tpc != 0) {
int time(MI), needtime(0);
map<int, T> tpc;
for (int i(0);i < Tpc;++i) {
scanf("%d%d%d%d%d", &name, &num, &nt, &ttmp.ti, &to);
if (time > nt) time = nt;
auto& now(tpc[name] = ttmp);
for (int i(0);i < num;++i)
now.table.push(nt), nt += to;
}
scanf("%d", &Psnl);
vector<P> psnl(Psnl);
for (int i(0);i < Psnl;++i) {
scanf("%d%d", &ptmp.id, &ptmp.n);
for (int j(0);j < ptmp.n;++j)
scanf("%d", ptmp.to + j);
psnl[i] = ptmp;
}
while (Tpc) {
int jumpt = MI;//Jump time to the earliest possible available time of all the men
sort(psnl.begin(), psnl.end());
for (auto& p : psnl) {//For all staff members
int pti(MI);//Man's earliest possible available time
if (p.at > time) pti = p.at;//Man is busy
else { //Man is available
for (int i(0);i < p.n;++i) {//For all topics that man can handle
auto& t(tpc[p.to[i]]);
if (t.table.empty()) continue; //Man find current topic finished
if (t.table.front() <= time) { //Man find his topic
pti = time + t.ti;
if (needtime < pti) needtime = pti;
p.st = time;
t.table.pop();
if (t.table.empty()) --Tpc;
break;
}
else if (t.table.front() < pti) pti = t.table.front(); //Man find current topic will be available at t.table.front()
}
p.at = pti;
}
if (pti < jumpt) jumpt = pti;
}
time = jumpt;
}
printf("Scenario %d: All requests are serviced within %d minutes.\n", ++Scenario, needtime);
}
return 0;
}
分析:每分钟每分钟的模拟的话就有点慢了。我的做法是:
对每个topic,把它们每次过来询问的时间放在queue里,每开始处理一件就pop一件,直到它empty则说明处理完毕。
对每个员工,找出他的下一次“开始空闲”或“可能有事情做”的时间pti。所谓“开始空闲”或“可能有事情做”的时间是指:
- 若这人正在处理一个topic,则pti=处理完本topic的时间,这叫“开始空闲”;
- 若这人闲着,则给他找活干,若找到了可处理topic,pti=处理完这个topic的时间,也是“开始空闲”;
- 若这人闲着,但发现无活可干,每个他可以处理的topic都还没到来,那么他的pti=最快到来的下一个topic的时间,即只有topic来了他才可能“可能有事情做”。之所以是“可能”,因为每次都要按照“上一次开始干活的时间与ID”把每个人排序,所以他的活可能被抢,依然是“无事可干”状态。
- pti初始化时为int的最大值。只有当该员工的每个topic全都处理完的状态时,pti全程没有被赋值,于是该员工的下一个空闲时间变成无限大,一定程度上相当于以后的模拟运算就不考虑他了。
找出了每个人的pti,让时间跳转到最近的一个pti,进行下一次循环(要注意的是time最终跳出循环时可能不等于所需时间,所以又定义了个needtime)。
这题最坑的是,udebug的算法是错误的(⊙﹏⊙)。它的数据答案我死活对不上,害的我调试了好几天。。。后来去网上找别人的算法,发现结果和udebug也一大半数据对不上。但是提交后就AC了。(这uva的数据也比较水,udebug上的100个测试数据我运算了蛮慢的,但提交上去就0.010s。不过开心的是我的运算比网上找的那几个算法都快。)
[刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 5-7/UVa12100 - Printer Queue
题意:一堆文件但只有一个打印机,按优先级与排队顺序进行打印.也就是在一个可以插队的的队列里,问你何时可以打印到.至于这个插队啊,题目说"Of course, those annoying t ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...
- [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536
这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...
- [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities
题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...
- [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary
题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...
随机推荐
- nginx浏览目录
[root@localhost domains]# vi web.jd.com location / proxy_set_header X-Forwarded-For $proxy_add_x_for ...
- ASP.NET Core MVC 源码学习:MVC 启动流程详解
前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...
- ubuntu-terminal快捷键
常用快捷键功能:Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ctrl+d 删除当 ...
- Linux 下安装 Memcached 和 PHP 开启 Memcached 扩展
[项目背景]:阿里云ECS服务器,Linux(centos7.2 64位),环境部署使用的是阿里云一键安装包(LAMP)等 [项目需求]:linux安装memcached 和php开启Memcache ...
- Linux线程的创建
一.线程与进程的区别 1.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 2.进程是资源分配的基本单位.所有与该进程有关的资源,都 ...
- 高并发场景之RabbitMQ篇
上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能解决问题,后来采用Redis队 ...
- React-Native 之 项目实战(四)
前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...
- nginx反向代理的nginx.conf配置
下面的配置是nginx.conf的示例 nginx反向代理 就是说把跨域的url通过本地代理的方式,变成同域的请求,如此来解决跨域问题 该配置下 通过http://localhost/html5/路径 ...
- preg_*匹配的字符串长度限制问题以及nginx,php上传文件过大问题
问题背景 使用插件上传高清图片,用的插件base64转码的,上传失败,接口提示:413 (Request Entity Too Large) 问题分析与解决 首先想到的是nginx和php的服务器配 ...
- 发散问题——Spring容器及加载
一.前言 发散问题系列,是围绕日常工作,发散思考,提取问题,并寻求答案的一个系列.总的来说,就是将遇到的问题发散来提出更多的问题,并通过解决发散问题,从而对问题有更深入的了解,对知识有更深刻的记忆,帮 ...