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 DEBUG
freopen ( "1.txt" , "r" , stdin ) ;
#endif
int 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 ;
}