pta 甲 1017 Queueing at Bank

此题只要老老实实按题目来不要想太多,,,
例如最后一个点。。。我特判了最后处理完超过五点的情况就按五点处理
想着人家都关银行了,,你就等到5点就得走了,,结果发现想多了,,
思路:
1.先把超过五点的搞掉,没来过,没来过,,
2. 少于窗口 特判8点
3. 等于窗口数,拉出队列中最早结束的那个,与现在这个对比,如果发现现在那位要等最早那位一会,那就时间加上呗
注:全部搞为秒来会很舒服
代码如下:

#include <bits/stdc++.h>
using namespace std;
struct stu{
	int times;		 //到达时间 
	int P;           //处理时间 
}ren[10005];
double avtime;
priority_queue <stu> que;
bool operator  < (const stu &A , const stu &B){
	return A.times > B.times;
} //已经在办事的人按谁早谁出来 
int comp(stu A, stu B){
	return A.times < B.times;
} //等待的人按时间排 
const int eight = 8*3600,fif = 17 * 3600;//直接化秒 
int main()
{
	int N,wins,s,f,m,pp,sumtime,n = 0; 
	scanf("%d%d",&N,&wins);
	for (int i = 0; i < N; i++){
		scanf("%d:%d:%d %d",&s,&f,&m,&pp);
		sumtime  = s*3600 + f*60 +m;
		pp *= 60;
		if( sumtime >= fif) continue; //超时了
		else  {
			ren[n].times = sumtime;
			ren[n++].P = pp;
		}	
		//存档时间 
	}
	sort(ren,ren+n,comp);
	//走位走位
	//对每个进入的人继续时间计算即可 
	for (int i = 0; i < n; i++)
	{
		stu nows;
		if(que.size()  < wins){ //少于窗口数 特判八点 
			if(ren[i].times < eight) {
				avtime += eight - ren[i].times;
				ren[i].times = eight; 
			}    
		} 
		else{
			stu lasts;
			lasts = que.top(); que.pop();
			if(lasts.times > ren[i].times)  {    //如果要等 
				avtime += lasts.times - ren[i].times;
				ren[i].times = lasts.times;
			}		 				
		}
		
		nows.times = ren[i].P + ren[i].times;
		que.push(nows);
	} 
	avtime  /= n*60;
	printf("%.1f",avtime);
	return 0;
} 
发布了55 篇原创文章 · 获赞 1 · 访问量 2636

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/104901071