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

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/83962223