【PAT甲级】1017 Queueing at Bank (25 分)
题意:
输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行的时间以及该用户占用银行资源的时间,求用户的平均等待时间。(当一位用户早于早晨八点到达银行不开门,他需要等待,当一位用户晚于下午五点到达银行关门,该用户不计入等待时间计算)【答案保留一位小数】
AAAAAccepted code:
#include<bits/stdc++.h> using namespace std; string s; typedef struct{ int t,x; }stct; stct user[10007]; bool cmp(stct a,stct b){ if(a.x!=b.x) return a.x<b.x; return a.t<b.t; } int line[107]; int main(){ double sum=0; int n,k; cin>>n>>k; for(int i=1;i<=n;++i){ cin>>s>>user[i].t; int x=0; x+=(s[0]-'0')*36000; x+=(s[1]-'0')*3600; x+=(s[3]-'0')*600; x+=(s[4]-'0')*60; x+=(s[6]-'0')*10; x+=s[7]-'0'; user[i].x=x; user[i].t*=60; if(user[i].x<8*3600){ sum+=8*3600-user[i].x; user[i].x=8*3600; } } sort(user+1,user+1+n,cmp); int cur=99999999; int num=0; for(int i=1;i<=k;++i){ if(i>n) break; num=i; line[i]=user[i].x+user[i].t; cur=min(cur,line[i]); } for(int i=k+1;i<=n;++i){ if(user[i].x>17*3600) break; num=i; sum+=max(0,cur-user[i].x); for(int j=1;j<=k;++j) if(line[j]==cur){ if(cur<user[i].x) line[j]=user[i].x+user[i].t; else line[j]+=user[i].t; break; } cur=99999999; for(int j=1;j<=k;++j) cur=min(cur,line[j]); } sum/=num; sum/=60; printf("%.1f",sum); return 0; }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)