本文主要是介绍PAT A1017 Queueing at Bank ——茅檐低小,溪上青青草,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PAT A1017 Queueing at Bank
- 跟之前有道银行排队的题一样,也是循环中每次找到最早完事的窗口然后扔过去一个等着的人(当然也可能是窗口等人)
- 每次做这种题最讨厌那个等待时间单位是分钟,累加,比较,输出都要注意单位对不对。。。
- 本次出现的问题:1.单位转换;2.win_endTime初始化失败,以后除了0还是老老实实用fill;3.如果是窗口等人,那这段时间也要累加到win_endTime里面
- 最后,本题没有无人到来的测试点,而且只考虑来晚了的不让进,但不会驱逐规定时间过来但需要等一万年的人 —— 关于这点书上说的不对,因为他的INF给了一个很大的数,所以当win_endTime超过17点依然可以继续工作,而我的INF刚好17点,所以最后一个测试点挂了,后来把min取为INF + INF就过了
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>using namespace std;#define INF (17 * 60 * 60)struct Custom{int arr_time,need_time,wait_time,serve_time;
};
vector<Custom> vc;
int win_endTime[101] = {0};bool cmp(Custom c1,Custom c2){return c1.arr_time < c2.arr_time;
}#define DEBUG int main(){#ifdef DEBUGfreopen("1.txt","r",stdin);
#endifint num,win_num;cin >> num >> win_num;for(int i = 0;i < num;i ++){Custom tmp;int HH,MM,SS;scanf("%02d:%02d:%02d %d",&HH,&MM,&SS,&tmp.need_time);tmp.arr_time = HH * 3600 + MM * 60 + SS;if(tmp.arr_time > INF) continue;if(tmp.need_time > 60) tmp.need_time = 60;vc.push_back(tmp);}sort(vc.begin(),vc.end(),cmp);int cnt = 0;int sum_wait = 0;fill(win_endTime,win_endTime + win_num,(8 * 3600));while(cnt < vc.size()){int min = INF + INF,min_i = 0;for(int i = 0;i < win_num;i ++){if(win_endTime[i] < min){min = win_endTime[i];min_i = i;}}vc[cnt].serve_time = max(vc[cnt].arr_time,win_endTime[min_i]);vc[cnt].wait_time = vc[cnt].serve_time - vc[cnt].arr_time;sum_wait += vc[cnt].wait_time;if(vc[cnt].serve_time > win_endTime[min_i]) win_endTime[min_i] = vc[cnt].serve_time;win_endTime[min_i] += vc[cnt].need_time * 60;cnt ++;}printf("%.1lf",(double)(sum_wait / 60.0 / vc.size()));return 0;
}
这篇关于PAT A1017 Queueing at Bank ——茅檐低小,溪上青青草的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!