UVA 822 Queue and A
2016-01-20 23:40
507 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 感觉UVA越来越做不动了,这个题又卡了我一整天。最初是编写代码边想思路,导致很多条件都没考虑到只好不断修改,最后程序直接崩溃连哪错了都不知道了。</span>
我的思路:主体:讨论人,把客服循环一遍,当找到有空的客服时,再找到他要干的工作。
其他:1,用map<int,vector>把一个工作及其客服对应起来,遍历map对vector进行排序,以此找到每个工作对应的人。
2,用map把主题与数组编号,客服与数组编号对应起来,这样查找时就方便了。
3,0结束的条件是:剩余的任务为且所有客服都已执行完任务。
#include<iostream> #include<vector> #include<algorithm> #include<map> #include<cstdio> using namespace std; struct topic { int tid,num,t0,t,dt,num1; int is_exe, time, time_between, first; }; struct member { int pid,k,last,busy,time,leixing,time1; vector<int>pidk; bool operator < (const member&a) const { if(a.last == last) return a.pid > pid; else return a.last > last; } }; vector<topic>topics; vector<member>staff; map<int,int>ha; //将任务主题与相应的tid对应 map<int,vector<member> >num; //做每个工作的人,int是tid,后面的vector是做这个工作的客服 map<int,int>ren; //将客服与pid对应 int can_exe(int x, int t) { if(t < topics[x].t0) return 0; if(topics[x].dt == 0) return topics[x].num > 0; if(topics[x].num == 0)return 0; if((t+topics[x].dt-topics[x].t0)/topics[x].dt == (topics[x].num1-topics[x].num)) return 0; return 1; } int main() { int m, n, kase = 0, i, j, k; while(cin >> m && m){ int time = 0; topics.clear(); staff.clear(); ha.clear(); ren.clear(); for(i = 0; i < m; i++){ topic a; cin>>a.tid>>a.num>>a.t0>>a.t>>a.dt; a.num1 = a.num; topics.push_back(a); ha[a.tid] = i; } cin >> n; for(i = 0; i < n; i++){ member a; a.pidk.clear(); a.time1 = a.last = a.busy = a.time = 0; int x; cin >> a.pid >> a.k; ren[a.pid] = i; for(j = 0; j < a.k; j++){ cin >> x; a.pidk.push_back(x); } staff.push_back(a); } loop:for(time = 0; time < 500000; time++){ num.clear(); for(i = 0; i < n; i++) //找谁有空 if(!staff[i].busy) for(j = 0; j < staff[i].k; j++) //找到此人能够执行的工作 if(can_exe(ha[staff[i].pidk[j]],time)){ if(!num.count(staff[i].pidk[j])) num[staff[i].pidk[j]] = vector<member>(); num[staff[i].pidk[j]].push_back(staff[i]); break; } map<int,vector<member> >::iterator it; for(it = num.begin(); it != num.end(); ++it){ sort(it->second.begin(),it->second.end()); int temp = ren[it->second[0].pid]; staff[temp].busy = 1; staff[temp].last = time; staff[temp].leixing = it->first; topics[ha[it->first]].num--; } int all_zero = 1; for(i = 0; i < n; i++){ if(staff[i].busy) staff[i].time++; if(staff[i].busy && staff[i].time == topics[ha[staff[i].leixing]].t) {staff[i].time = 0;staff[i].busy = 0;} } for(i = 0; i < m; i++) if(topics[i].num > 0) {all_zero = 0;break;} for(i = 0; i < n; i++) if(staff[i].time > 0) {all_zero = 0;break;} if(all_zero) break; } printf("Scenario %d: All requests are serviced within %d minutes.\n",++kase, time+1); } return 0; }
相关文章推荐
- G面经prepare: Maximum Subsequence in Another String's Order
- iOS UITableView(十四) 设置TbleviewController的滚动范围
- android tv-Building TV Games
- com.android.tools.build:gradle:2.0.0-alpha3 build errors
- Android BLE与终端通信(二)——Android Bluetooth基础科普以及搜索蓝牙设备显示列表
- Android BLE与终端通信(二)——Android Bluetooth基础搜索蓝牙设备显示列表
- Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptabl
- UITableView Group类型扁平化适配iOS6.0
- Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址
- Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址
- 简述UIViewControl之间的七种传值方式
- request \response 总结
- 【慕课笔记】第四章 流程控制语句 第10节 JAVA循环跳转语句之continue
- servlet 之request
- LeetCode 225 Implement Stack using Queues(用队列来实现栈)(*)
- mui中文在线手册及教程文档
- HDU1242 Rescue(BFS松弛)
- C#queue队列总结
- LeetCode 232 Implement Queue using Stacks(用栈来实现队列)(*)
- HBuilder mui引导页制作