当前位置: 首页 > 工具软件 > 101 > 使用案例 >

1017

毕浩渺
2023-12-01

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

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

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

 

 类似资料:

相关阅读

相关文章

相关问答