日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVALive 6093 Emergency Room --优先队列实现的模拟

發布時間:2025/7/25 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVALive 6093 Emergency Room --优先队列实现的模拟 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給n個醫生,這些醫生有一個上班時間,然后給一些病人,病人有一個到達的時間,以及一些診斷,診斷有property(優先級)和duration(診斷時間)這兩個屬性,每個病人可能要診斷多次,最后問每個病人的全部療程完成離開醫院的時間是多少。

分析:用優先隊列存儲診斷,病人,然后模擬一個診斷過程,完成病人的個數等于病人數的時候就結束。具體看代碼吧。

代碼:

#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <cstdlib> using namespace std; #define N 100102 #define M 22struct treat {int tim,ind;treat(int _tim,int _ind):tim(_tim),ind(_ind){}treat(){}bool operator <(const treat& a)const{return tim > a.tim;} };struct node {int x,y;node(int _x,int _y):x(_x),y(_y){}node(){} };struct Patient {int id,pro,arrtim;Patient(int _id,int _pro,int _arrtim):id(_id),pro(_pro),arrtim(_arrtim){}Patient(){}bool operator <(const Patient& a)const{if(a.pro == pro)return arrtim > a.arrtim;return pro < a.pro;} };priority_queue<treat> T; priority_queue<Patient> P; vector<node> pat[506],ans; int arrive[506],treated[506];int cmp(node ka,node kb) {if(ka.x == kb.x)return ka.y < kb.y;return ka.x < kb.x; }int main() {int n,Tim,a,b,Pcnt,cs = 1;int i,j;while(scanf("%d%d",&n,&Tim)!=EOF && (n+Tim)){Pcnt = 0;ans.clear();while(scanf("%d",&arrive[Pcnt]) && arrive[Pcnt] != -1){pat[Pcnt].clear();while(scanf("%d%d",&a,&b) && (a+b)) //property,duration pat[Pcnt].push_back(node(a,b));Pcnt++;}while(!T.empty())T.pop();while(!P.empty())P.pop();for(i=0;i<n;i++) //n個醫生準備T.push(treat(Tim,-1));for(i=0;i<Pcnt;i++)T.push(treat(arrive[i],i)); //編號iint doctor = 0;memset(treated,-1,sizeof(treated));int pcnt = 0;while(pcnt < Pcnt){int nowt = T.top().tim;while(!T.empty() && T.top().tim == nowt){if(T.top().ind == -1) //空閑doctordoctor++;else{int pid = T.top().ind;treated[pid]++;if(treated[pid] >= pat[pid].size()) //全部療程完成 {ans.push_back(node(nowt,arrive[pid]));pcnt++;}elseP.push(Patient(pid,pat[pid][treated[pid]].x,arrive[pid]));}T.pop();}while(!P.empty() && doctor){int k = P.top().id;T.push(treat(nowt+pat[k][treated[k]].y,-1)); //此時空閑T.push(treat(nowt+pat[k][treated[k]].y,k)); //或者繼續診斷此病人 P.pop();doctor--;}}sort(ans.begin(),ans.end(),cmp);printf("Case %d:\n",cs++);for(i=0;i<ans.size();i++)printf("Patient %d released at clock = %d\n",ans[i].y,ans[i].x);}return 0; } View Code

?

轉載于:https://www.cnblogs.com/whatbeg/p/3908275.html

總結

以上是生活随笔為你收集整理的UVALive 6093 Emergency Room --优先队列实现的模拟的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。