1017

       模拟题,逻辑很简单,但这题有一点没提到,只要是在下午五点之前到达的客户,都可以完成业务,就算超过五点才开始也是可以的,但五点之后到达就不行。

       有些地方初始化没注意到,卡了很久。

//2020_01_19 20:50
/*
	所有到银行的人都按到达时间排队,只要有空闲的窗口就可以开始业务
	判断队列第一个人的到达时间是否小于当前时间,如果不是则要增加当前时间,如果是则寻找空闲窗口
	如果有空闲窗口则开始业务,累加等待时间,并记录此人的结束时间;
	如果没有空闲窗口则寻找结束时间最早的窗口并判断与当前时间的关系,是否需要更新当前时间 
*/
#include<iostream> 
#include<algorithm>
#define N 10000+10
#define K 100+10
using namespace std;
struct People{
	int b,p,e;
	bool operator <(const People &P){
		return b<P.b;
	}
}Peo[N];
int Bank[K];

int main()
{
	//freopen("input.txt","r",stdin);
	int n,k,c; 
	cin>>n>>k;
	c=0;
	for(int i=0;i<n;i++) {
		int hh,mm,ss,p;
		scanf("%d:%d:%d %d",&hh,&mm,&ss,&p);
		if(hh*60*60+mm*60+ss<=17*60*60){
			Peo[c].b=hh*60*60+mm*60+ss;
			Peo[c].p=p*60;
			c++;
		}
	}
	for(int i=1;i<=k;i++)
		Bank[i]=-1;
	sort(Peo,Peo+c);
	int time=8*60*60; 	//now time
	int sum=0;			//sum of all people waiting time
	int p=0;			//now position in array of Peo
	int b=k;			//now how many banks can suppose serve
	while(p<c){
		if(b==0){
			int min,minp;
			min=Peo[Bank[1]].e;
			minp=1;
			for(int i=1;i<=k;i++){
				if(Peo[Bank[i]].e<min){
					min=Peo[Bank[i]].e;
					minp=i;
				}	
			}
			if(Peo[Bank[minp]].e>time){
				time=Peo[Bank[minp]].e;
			}	
			Bank[minp]=-1;
			b++;
		}
		while(p<c&&b>0){
			if(Peo[p].b<=time){
				for(int i=1;i<=k;i++){
					if(Bank[i]==-1){
						Bank[i]=p;
						Peo[p].e=time+Peo[p].p;	
						sum+=(time-Peo[p].b);
						p++;
						b--;
						break;
					}	
				}
			}
			else
				time=Peo[p].b;
		}
	} 
	if(c==0)
		printf("0.0");
	else
		printf("%.1f",double(sum/60.0/c));
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值