题目链接
题目大意
description
n个人去银行取钱,银行有k个窗口,人按先来后到顺序接受银行窗口的服务。银行8点开门15点关门,8点之前来的人要等到八点在接受服务,五点以后来的人就不能接受服务了。现在给出每个人到达时间和服务时间,求平均等待时间。
思路
inspration
第一反应,PAT不愧PAT,你看看这题,先来先服务的思想融合的多完美。不过也没啥意思,水题。
以0点0分0秒为基准算出每个人在第几秒到来,开个数组num记录每个窗口可以服务下一个人的时间,将其初始化为28800(也就是8点)。然后开另一个数组记录人的到达时间和服务时间,按到达时间给排个序,然后针对每个人,去找num里面的最小值(就是最早服务完上一个人的窗口),然后随便搞一搞就好了。
坑点
pit
没啥坑点,无非是判断下窗口服务完上一个人时下一个人还没有来的情况,还有估计就是判断一个人都没有服务的情况(因为算平均值需要除以人数,人数为0就会出毛病)。不过这种写的时候都考虑到了,一发AC。
代码
括号换行,又臭又长
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
struct node
{
int time;
int serve;
};
bool cmp(node a,node b)
{
return a.time<b.time;
}
int main()
{
int n,k,cnt=0,num[102];
node peo[10002];
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
num[i]=28800;
for(int i=0;i<n;i++)
{
string s;
int serve;
cin>>s>>serve;
peo[i].time = ((s[0]-'0')*10+s[1]-'0')*60*60+((s[3]-'0')*10+s[4]-'0')*60+((s[6]-'0')*10+s[7]-'0');
peo[i].serve = serve;
}
sort(peo,peo+n,cmp);
double ave=0;
for(int i=0;i<n;i++)
{
if(peo[i].time>54000)
break;
int minn=INF,now;
for(int j=0;j<k;j++)
{
if(num[j]<minn)
{
minn = num[j];
now = j;
}
}
ave+=max(num[now]-peo[i].time,0);
cnt++;
num[now]=max(num[now],peo[i].time)+peo[i].serve*60;
}
if(cnt==0)
printf("0.0\n");
else
printf("%.1lf\n",ave/(cnt*60.0));
return 0;
}