复杂模拟 | 1017 模拟N个顾客M个柜台进行排队

 

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>


#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX (1<<30)+1
#define V vector<int>

using namespace std;

struct Customer{
    int comeTime;
    int serveTime;
    Customer(int c,int s):comeTime(c),serveTime(s){
    }
};

bool cmp(Customer a,Customer b){
    return a.comeTime<b.comeTime;
}

int processTime(int H,int M,int S){
    return H*3600+M*60+S;
}

int windowEnd[1000];//每个窗口的结束时间 

int main(){
//    freopen("1017.txt","r",stdin);
    int N,M,i,j,hh,mm,ss,p;
    I("%d %d",&N,&M);
    int startTime=processTime(8,0,0);
    int endTime=processTime(17,0,0);
    vector<Customer> C;
    FF(i,M) windowEnd[i]=startTime;    //初始化每个窗口的开始时间 
    while(N--){
        I("%d:%d:%d %d",&hh,&mm,&ss,&p);
        int thisTime=processTime(hh,mm,ss);
        if(thisTime>endTime) continue;
        p*=60;
        p=min(p,3600);        //处理排队超时 
        C.push_back(Customer(thisTime,p));
    }
    sort(C.begin(),C.end(),cmp);
    int wait=0;
    //对于每一个顾客进行处理
    FF(i,C.size()){
        //选择一个最早结束的
        int minTime=MAX,mI;
        FF(j,M) {
            if(windowEnd[j]<minTime){
                minTime=windowEnd[j];
                mI=j;
            }
        }
        if(windowEnd[mI]>C[i].comeTime){    //顾客来早了,需要等待 
            wait+=windowEnd[mI]-C[i].comeTime;
            windowEnd[mI]+=C[i].serveTime;
        }else{        //顾客不用等待 
            windowEnd[mI]=C[i].comeTime+C[i].serveTime;
        }
    }
    O("%.1f\n",wait/60.0/C.size());
    return 0;
}

 

转载于:https://www.cnblogs.com/TQCAI/p/8574365.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值