1017 Queueing at Bank (25分)模拟:关于事务排队处理

题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805491530579968

题意

银行M个窗口,N个人来办事,几点到,每个人需要的处理时间
问平均等待时间(17点后到不处理~)

Sample Input:

7 3
07:55:00 16
17:00:01 2
07:59:59 15
08:01:00 60
08:00:00 30
08:00:02 2
08:03:00 10

Sample Output:

8.2

思路

用一个数组windows[]模拟M个窗口的的当前时间(8点开始)
对N个记录按赶到时间排序,每个人选择当前时间最小的窗口进行办理

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
struct node{
    int arrive;
    int p_time;
    node(int a,int b):arrive(a),p_time(b){}
};

vector<node>R;
bool cmp(node x,node y) {return x.arrive<y.arrive;}
int main()
{
    int N,M; cin>>N>>M;
    while(N--)
    {
        int a,b,c,d; scanf("%d:%d:%d %d",&a,&b,&c,&d);
        int temp=a*3600+b*60+c;
        //迟到的人忽略
        if(temp<=17*3600) R.push_back(node(temp,d*60));
    }
    sort(R.begin(),R.end(),cmp);
    int wait=0;
    //记录每个窗口的时间,初始都是8:00开始,啊啊啊啊啊啊啊啊啊
    vector<int>windows(M+2,8*3600);//新写法
    int i=0;
    for(;i<R.size();++i)
    {
        int p,minn=inf;
        for(int j=1;j<=M;++j)//选最先处理完的窗口
        {
            if(windows[j]<minn) {
                minn=windows[j];
                p=j;
            }
        }
        if(R[i].arrive<windows[p]) {//需要等待
            wait+=windows[p]-R[i].arrive;
            windows[p]+=R[i].p_time;
        }
        else windows[p]=R[i].arrive+R[i].p_time;//不需要等待
    }
    printf("%.1f
",wait*1.0/60/R.size());
    return 0;
}

总结

怎么说呢,挺简单的模拟,就是没想到用一个数组来模拟不同窗口的时间
最开始只想着不同窗口用一个时间来模拟。。。菜啊~

原文地址:https://www.cnblogs.com/liuyongliu/p/13457652.html