zoukankan      html  css  js  c++  java
  • 1014 Waiting in Line

    link

     解法:

    模拟双端队列。刚开始的N*M个客户一次排队到窗口,并计算一下他们完成服务的时间点。对于每一个后面的人,看哪儿一个窗口最早有人出队,则排在次队,根据队尾的人计算一下此人的结束时间。

    最后判断如果一个人的开始服务时间>=17:00,则sorry。

    #include <bits/stdc++.h>
    # define LL long long
    using namespace std;
    
    int p[1001];
    int f[1001];
    int window[20];
    
    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", &p[i]);
        }
        memset(f,-1,sizeof(f));
        for(int i=0;i<N;i++) window[i]=8*60;
        vector<deque<int>> qs(N);
        int w=0;
        int id=1;
        for(id=1;id<=K && id<=N*M;id++){
            if(qs[w].empty()) f[id]=8*60+p[id];
            else{
                f[id]=f[qs[w].back()]+p[id];
            }
            qs[w].push_back(id);
            w=(w+1)%N;
        }
        while(id<=K){
            int minend=INT_MAX;
            int wid=0;
            for(int i=0;i<N;i++){
                if(f[qs[i].front()]<minend){
                    wid=i;
                    minend=f[qs[i].front()];
                }
            }
            if(minend>=17*60) break;
            qs[wid].pop_front();
            f[id]=f[qs[wid].back()]+p[id];
    
            qs[wid].push_back(id);
            id++;
        }
        for(int i=0;i<Q;i++){
            int q;
            scanf("%d", &q);
            if(f[q]==-1 || f[q]-p[q]>=17*60) printf("Sorry
    ");
            else {
                int mm=f[q]%60;
                int hh=f[q]/60;
                printf("%02d:%02d
    ", hh, mm);
            }
        }
        return 0;
    }
  • 相关阅读:
    MVC 下载相关
    中缀、前缀和后缀表达式
    什么是堆栈?
    为什么和其他语言相比C语言是快速的语言
    什么是回溯法?
    产生n bit所有可能的序列
    讨论汉诺塔之谜
    递归和内存分配(可视化)
    关于递归
    随机数产生函数的范围转换
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12921708.html
Copyright © 2011-2022 走看看