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

        歡迎訪問 生活随笔!

        生活随笔

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

        编程问答

        PAT (Advanced Level) 1017 Queueing at Bank(模拟)

        發布時間:2024/4/11 编程问答 59 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 PAT (Advanced Level) 1017 Queueing at Bank(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

        題目鏈接:點擊查看

        題目大意:模擬銀行服務的過程,輸出每個客戶的平均等待時間

        題目分析:類似的銀行服務模擬題,不過與之前那個題不太一樣的是,這一次所需要統計的信息變少了,只需要統計一下每個客戶的平均等待時間,加上每個客戶到達銀行的時間也不再統一,我們需要重新制定規則

        最后還有一個坑點,就是只要用戶在銀行下班之前到達銀行,那么無論多晚該用戶都可以完成服務,所以需要統計等待時間,相對的,所有超過下班時間到達的用戶,都不算數,最后計算平均值得時候也不用算上他們

        具體實現的話,我還是用一層for循環當秒表用,每次走一秒,判斷用戶當前的情況,需要注意的是,因為在輸入的時候就已經將不合法的用戶排除在外了,所以我們秒表的下限是早晨八點,上限必須設置到第二天一點,也就是25點,當然設大了也沒關系,一開始我設置了一個1700點,一樣能過,因為有一個剪枝,所以并不會因為這個上限過大而超時,反而會因為上限過小而答案錯誤

        這里就對應著最后一個測試點了:

        為什么上限設置到下午五點會答案錯誤呢?因為整個程序模擬的是在秒表下限到上限中用戶的等待時間的,若超過了下班時間,則還在排隊的用戶就沒辦法記錄了,我們需要將上限設置的大一點才行,比如隨便舉個例子:

        2 1

        17:00:00 60

        16:59:59 60

        正確答案應該是30分鐘吧(60/2),這樣一個例子就能讓銀行的工作時間到達下午七點,若再來幾組相似的樣例,銀行工作的上限會變得很大很大,不過這個題目還算是良心的,將時間設到第二天凌晨一點就能過掉了。。

        代碼:

        #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e4+100;struct Node {int time;int remain;Node(){}Node(int TIME,int REMAIN){time=TIME;remain=REMAIN;}bool operator<(const Node& a)const{return time>a.time;} };int n,m;int win[110];queue<Node>wait;//在排隊的人 priority_queue<Node>line;//所有人 bool check() {for(int i=1;i<=m;i++)if(win[i])return false;return true; }int main() { // freopen("input.txt","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int h,m,s,temp;scanf("%d:%d:%d %d",&h,&m,&s,&temp);if(17*60*60<h*60*60+m*60+s)continue;line.push(Node(h*60*60+m*60+s,temp*60));}n=line.size();int ans=0;for(int i=1;i<=m;i++)//先讓提前來的人去窗口前面等著 {if(line.empty()||line.top().time>=8*60*60)//如果提前來的人沒了 break;Node cur=line.top();line.pop();win[i]=cur.remain;ans+=8*60*60-cur.time;}while(line.size()&&line.top().time<8*60*60)//提前來的人很多,就先排隊,并記錄等待時間 {Node cur=line.top();line.pop();wait.push(cur);ans+=8*60*60-cur.time;}for(int i=8*60*60;i<=25*60*60;i++)//枚舉秒 {if(check()&&line.empty()&&wait.empty())//沒人了 break;if(!line.empty()&&line.top().time==i)//新來了一個人,先去排隊 {wait.push(line.top());line.pop();}for(int j=1;j<=m;j++)//枚舉每一個窗口 {if(win[j])//還有人在辦手續 win[j]--;//時間-1s if(!win[j])//窗口沒人了 {if(!wait.empty())//還有人在排隊 {win[j]=wait.front().remain;//補上來 wait.pop();}}}ans+=wait.size();}printf("%.1f\n",1.0*ans/60/n);return 0; }

        ?

        超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

        總結

        以上是生活随笔為你收集整理的PAT (Advanced Level) 1017 Queueing at Bank(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

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