版权声明:本文为博主原创文章,转载请注明出处,谢谢! 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;
}