UVA 822 Queue and A
来源:互联网 发布:知乎阿里云免费开通码 编辑:程序博客网 时间:2024/06/01 17:50
<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;}
0 0
- UVa 822 - Queue and A
- UVA 822 Queue and A
- 822 - Queue and A
- UVA - 133 The Dole Queue 单纯模拟:1A
- UVa822 - Queue and A(看着也写不利索的结构体)
- Team Queue(queue) - uva 540
- UVa 540 Team Queue
- uva 540 team queue
- Uva 540 Team Queue
- uva 540 - Team Queue
- UVa 540 - Team Queue
- UVA 540 Team Queue
- UVA 5002 The Queue
- uva 540 Team Queue
- uva 540 Team Queue
- Uva 540 Team Queue
- UVA 10128 Queue
- UVa 540 - Team Queue
- <s:select />标签的用法
- 51nod 1060:最复杂的数 反素数
- javascript中typeof的运用
- Android 四大组件详解(二) Service
- 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
- UVA 822 Queue and A
- 软引用 弱引用 缓存
- POJ 2449 A*经典水题
- Uncowed Forces
- 射频通信原理
- 初探JSP
- Gradle DSL method not found: 'android()
- 第五天,uiscorllview的滚动和缩放,以及代理调用,定时器,对话框
- Linux tar 命令