1. 程式人生 > >1014 Waiting in Line - 模擬(佇列)

1014 Waiting in Line - 模擬(佇列)

題意:

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);
    }
}