PAT (Advanced Level) Practice 1017 Queueing at Bank (25分)

#include<bits/stdc++.h>
#define inf 999999999
using namespace std;
int n,k;
struct nod{
	int ftime; //每一个柜台的空闲时间 
}gt[105];
struct node{
	int start; //到来时间 
	int time; //持续时间 
	int wait; //等待时间 
}co[10005];
bool comp(node a,node b)
{
	return a.start<b.start;
}
int main()
{
	cin>>n>>k;
	int h,m,s,p,cnt=0;
	for(int i=0;i<n;i++)
	{
		scanf("%d:%d:%d%d",&h,&m,&s,&p);
		int tt=h*3600+m*60+s;
		if(tt>=17*3600)
			continue;
		if(p>60)
			p=60;
		co[cnt].start=tt; //只记录在上班时间内来的顾客,超过点的不记 
		co[cnt].time=p*60;
		cnt++;
	}	
	for(int i=1;i<=k;i++)
		gt[i].ftime=8*3600; 
	sort(co,co+cnt,comp);
	for(int i=0;i<cnt;i++)
	{
		int minn=inf,u;
		for(int j=1;j<=k;j++)
		{
			if(gt[j].ftime<minn) //每次找最先空闲的柜台 
			{
				minn=gt[j].ftime;
				u=j;
			}
		}
		if(co[i].start<gt[u].ftime) //需等待 
		{
			co[i].wait=gt[u].ftime-co[i].start;
			gt[u].ftime+=co[i].time;
		}
		else //无需等待 
		{
			co[i].wait=0;
			gt[u].ftime=co[i].start+co[i].time;	
		}	
	}
	int sum=0;
	for(int i=0;i<cnt;i++)
		sum+=co[i].wait;
	printf("%.1f\n",sum*1.0/60/cnt);
	return 0; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henulmh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值