PAT

PAT1017 Queueing at Bank

没啥意思

Posted by canjuly on August 29, 2018

题目链接

题目大意

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;
}