A1017. Queueing at Bank (25)

版权声明:如需转载请联系[email protected] https://blog.csdn.net/qq_20633793/article/details/82121393

思路:
由于此题目所有的窗口大小均为1,所以仅需要用一个数组来表示各个窗口的结束服务时间即可,然后遍历合法顾客更新等待时间即可。
初始化使筛选掉来晚了的顾客

#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<algorithm>
#include<ctime>
#include<cassert>
#include<cctype>
using namespace std;

#define _for(i,lo,hi) for(int i=(lo);i<(hi);i++)
struct node{
    int come,last;//到达时间,等待时间,持续时间,结束时间,均以秒记
    node(int c,int la):come(c),last(la){}
    bool operator<(node& b){
        return come<b.come;
    }
};
int main(){
    //freopen("d:\\input.txt","r",stdin);
    int N,K;
    scanf("%d %d",&N,&K);
    vector<node> guest;
    vector<vector<int> > myq(K,vector<int>(N,0)); //黄线以内的队列,为了记录历史队列信息,用数组模拟队
    vector<int> front(N,0),back(N,0);//记录各个队列的队首和队尾,[front,back),队空是front==back,队中元素个数为back-front
    int hh,mm,ss,last;
    int daybegin=8*3600,dayend=17*3600;
    _for(i,0,N){
        scanf("%d:%d:%d %d",&hh,&mm,&ss,&last);
        int come=hh*3600+mm*60+ss;
        if(come>dayend)continue;
        guest.push_back(node(come,last*60));
    }
    sort(guest.begin(),guest.end());
    vector<int> window(K, daybegin);//表示每个窗口的结束时间
    int ans=0;//平均等待时间

    int id=0;//0号客户准备入队
    while(id<guest.size()){
        int minwin=0;//最早结束的窗口
        _for(i,1,K){
            if(window[i]<window[minwin])minwin=i;
        }
        //更新等待时间和窗口结束服务时间
        if(guest[id].come<window[minwin]){
            ans+=window[minwin]-guest[id].come;
            window[minwin]+=guest[id].last;
        }else
            window[minwin]=guest[id].come+guest[id].last;

        id++;
    }
    printf("%.1f\n",(float)ans/(60*guest.size()));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_20633793/article/details/82121393
今日推荐