1014 Waiting in Line - 模擬(佇列)
阿新 • • 發佈:2018-12-06
題意:
Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before 17:00, you must output Sorry
instead.
這句話是重點啊喂,就因為沒看清題,wa了好幾發qwq,就是說顧客在17:00之前沒被服務(不包括17:00)那就只能對他說Sorry嘍,從樣例中可以看出來,17:00的時候第6個顧客走了,第7個顧客正好在17點,但是不能被服務。
思路:
模擬佇列,佇列裡存的是該隊的顧客結束時間
每次判斷每個隊誰最先出來,pop(隊首元素),然後讓下一個人進去,push(這個人的結束時間)
注意:
1、時間處理都是先以分鐘來算,最後輸出時候再轉換
2、日期輸出:printf("%02d:%02d\n",h,m);
3、每次判斷最小值的時候,mymin變數記得重新賦值
(好久不敲程式碼,手生了qwq)
程式碼入下:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<set> #include<queue> #include<stack> #include<sstream> #define ll long long using namespace std; const int N=1006; int tim[N]; int ans[N]; void print(int x,int it){ int h=x/60,m=x%60; h+=8; if(x-tim[it]>=9*60)printf("Sorry\n"); else { printf("%02d:%02d\n",h,m); } } queue<int>qqq[25]; int main(){ int n,m,k,q; scanf("%d%d%d%d",&n,&m,&k,&q); for(int i=1;i<=k;i++)scanf("%d",&tim[i]); memset(ans,0,sizeof(ans)); for(int i=1;i<=m*n&&i<=k;i++){ if(i<=n)ans[i]=tim[i]; else ans[i]=ans[i-n]+tim[i]; if(i%n==0)qqq[n].push(ans[i]); else qqq[i%n].push(ans[i]); } int p=m*n+1,pos,tmp; if(k>m*n){ while(1){ int mymin=0x3f3f3f3f; for(int i=1;i<=n;i++){ tmp=qqq[i].front(); if(tmp<mymin){ mymin=tmp; pos=i; } } ans[p]=qqq[pos].back()+tim[p]; qqq[pos].pop(); qqq[pos].push(ans[p]); p++; if(p>k)break; } } int tt; for(int i=1;i<=q;i++){ scanf("%d",&tt); print(ans[tt],tt); } }