PAT 甲級 1017. Queueing at Bank
阿新 • • 發佈:2019-01-22
最後一個例子沒過
不過有巨巨發現我程式碼的bug,為什麼最後一個例子沒過,請聯絡我
#include<stdio.h> #include<algorithm> #include<vector> #include<queue> using namespace std; int change(int h,int m,int s){ return h*60*60+m*60+s; } struct Cus{ int time; int p; }; bool cmp(Cus a,Cus b){ return a.time<b.time; } Cus cus[10010]; int win[102]={0};//表示當前視窗所需要處理的時間 int main(){ int n,k;//n表示輸入的人數,和銀行開的視窗數 int early=8*60*60,late=17*60*60;//表示銀行開門和關門的時間 scanf("%d %d",&n,&k); int index=0; for(int i=0;i<n;i++){ int h,m,s,p; scanf("%d:%d:%d %d",&h,&m,&s,&p); Cus temp; temp.time=change(h,m,s); if(temp.time>late) continue; if(p>60) p=60; temp.p=p; cus[index++]=temp; } //index表示17:00前達到的人數 sort(cus,cus+index,cmp); int total_time=0,total_cus=0; int in=0;//in表示現在處理到幾個人 queue<Cus> wait;//在黃線外等待的人 while(in<index&&cus[in].time<early){ //對銀行開門前的顧客進行處理 total_time+=(early-cus[in].time); wait.push(cus[in]); in++; } for(int i=early;i<late;i++){ if(in<index&&i==cus[in].time) wait.push(cus[in++]); for(int j=0;j<k;j++){ //對每個視窗進行處理 if(win[j]>0) win[j]--; else{ if(wait.size()>0){ win[j]=wait.front().p*60; wait.pop(); } } } //如果K個視窗都處理結束,黃線外還有人 total_time+=wait.size(); } printf("%0.1f",(float)total_time/60/index); return 0; }