PAT甲级 1017 Queueing at Bank (25) 模拟

版权声明:本文为博主原创文章,转载请注明出处,谢谢! https://blog.csdn.net/xp731574722/article/details/80698970

题目链接

1017 Queueing at Bank (25)


题意

银行有n个顾客,k个窗口,求顾客的平均等待时间

解题思路

每次取最早可以使用的窗口就行了

Code

#include <bits/stdc++.h>

using namespace std;

struct Time
{
    int hh, mm, ss;
    bool friend operator < (Time a,Time b)
    {
        if(a.hh!=b.hh)
            return a.hh > b.hh;
        if(a.mm!=b.mm)
            return a.mm > b.mm;
        return a.ss > b.ss;
    }
    int friend operator - (Time a, Time b)
    {
        return a.hh * 3600 + a.mm * 60 + a.ss - b.hh * 3600 - b.mm * 60 - b.ss;
    }
    Time friend operator + (Time a,Time b)
    {
        Time sum = Time{a.hh+b.hh, a.mm+b.mm, a.ss+b.ss};
        if(sum.ss>=60)
        {
            sum.ss -= 60;
            sum.mm++;
        }
        if(sum.mm>=60)
        {
            sum.mm -= 60;
            sum.hh++;
        }
        return sum;
    }
};

struct Arr
{
    Time time;
    int p;
};

bool cmp(Arr a,Arr b)
{
    if(a.time.hh!=b.time.hh)
        return a.time.hh< b.time.hh;
    if(a.time.mm!=b.time.mm)
        return a.time.mm < b.time.mm;
    return a.time.ss < b.time.ss;
}
const Time open = Time{8, 0, 0},
           close = Time{17, 0, 0};
const int maxn = 10000 + 5;

priority_queue<Time> W;//window
Arr a[maxn];
int n, k;

int main(int argc, char const *argv[])
{
    //freopen("input.txt", "r", stdin);
    cin >> n >> k;
    for(size_t i = 0; i < k; i++)
        W.push(Time{8, 0, 0});
    int sum = 0, cnt = 0;
    for (int i = 0; i < n;i++)
    {
        scanf("%d:%d:%d", &a[i].time.hh, &a[i].time.mm, &a[i].time.ss);
        scanf("%d", &a[i].p);
    }
    sort(a, a + n, cmp);
    for (size_t i = 0; i < n; i++)
    {
        Time arr=a[i].time;
        int p=a[i].p;
        if (arr < close)
            continue;
        cnt++;
        Time w = W.top();
        W.pop();
        //printf("%d:%d:%d - %d:%d:%d\n",w.hh,w.mm,w.ss,arr.hh,arr.mm,arr.ss);
        if (w <arr)
        {
            sum += (w - arr);
        }
        else
        {
            w = arr;
        }
        //cout << sum << ' ' << p << endl;
        W.push(w + Time{0, p, 0});
    }
    if(cnt==0)
        cout << "0.0" << endl;
    else
    {
        printf("%.1f\n", double(sum)/60 / cnt);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xp731574722/article/details/80698970