PAT-1026 Table Tennis (30)
阿新 • • 發佈:2019-02-10
牛客網上過了,pat練題 18 分。所以關於題目大意和解題思路可能有些不對。。。
吐槽下:這題坑好多,有多個方面的細節題目都沒說清。真心花了很多時間,但還是不知道自己哪錯了。。。
#include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <cmath> #include <cstring> using namespace std; typedef struct Info { int time,playTime,waitTime,serveTime,Num,outRank; bool isVIP,isPass; }Info; Info client[10005]; typedef struct Table { int leftTime; bool isVIP; int cnt; }Table; Table table[101]; queue<int > ordinaryQueue; queue<int > VIPQueue; void init() { for(int i=1;i<=100;++i) { table[i].isVIP = false; table[i].leftTime = 0; table[i].cnt = 0; } } bool cmp(Info x1,Info x2) { if(x1.time < x2.time) return true; return false; } bool cmp1(Info x1,Info x2) { if(x1.serveTime < x2.serveTime) return true; else if(x1.serveTime == x2.serveTime) { if(x1.outRank < x2.outRank) return true; } return false; } int main(int argc, char** argv) { int n; cin >> n; for(int i=0;i<n;++i) { int h,m,s,playTime,isVIP; scanf("%d:%d:%d %d %d",&h,&m,&s,&playTime,&isVIP); client[i].time = h*3600+m*60+s; if(playTime>=120) playTime = 120; client[i].playTime = playTime*60; client[i].isVIP = (isVIP == 1)?true:false; client[i].isPass = false; client[i].serveTime = 0; } int tableNum,VIPTableNum; cin >> tableNum >> VIPTableNum; init(); for(int i=0;i<VIPTableNum;++i) { int x; cin >> x; table[x].isVIP = true; } sort(client,client+n,cmp); for(int i=0;i<n;++i) client[i].Num = i; int front = 0; for(int i=0;client[i].time<8*3600&&front<=n-1;++i) { ordinaryQueue.push(client[i].Num); if(client[i].isVIP) VIPQueue.push(client[i].Num); ++front; } int uu = 0; for(int i=3600*8;i<21*3600;++i) { //桌子剩餘時間 for(int j=1;j<=tableNum;++j) { if(table[j].leftTime != 0) --table[j].leftTime; } //模擬時間流逝 for(int j=front;client[j].time == i&&front<=n-1;++j) { ordinaryQueue.push(client[j].Num); if(client[j].isVIP) VIPQueue.push(client[j].Num); ++front; } //VIP優先判斷 for(int j=1;j<=tableNum;++j) { if(table[j].leftTime == 0 && table[j].isVIP == true && !VIPQueue.empty()) { table[j].leftTime = client[VIPQueue.front()].playTime; ++table[j].cnt; client[VIPQueue.front()].serveTime = i; client[VIPQueue.front()].outRank = uu++; client[VIPQueue.front()].isPass = true; VIPQueue.pop(); // cout <<j<<endl; } } //平民 for(int j=1;j<=tableNum;++j) { if(table[j].leftTime == 0 && !ordinaryQueue.empty()) { while(client[ordinaryQueue.front()].isPass) { ordinaryQueue.pop(); if(ordinaryQueue.empty()) break; } if(!ordinaryQueue.empty()) { table[j].leftTime = client[ordinaryQueue.front()].playTime; ++table[j].cnt; if(!VIPQueue.empty()) { if(ordinaryQueue.front() == VIPQueue.front()) VIPQueue.pop(); } client[ordinaryQueue.front()].outRank = uu++; client[ordinaryQueue.front()].serveTime = i; ordinaryQueue.pop(); // cout <<j<<endl; } } } if(front == n) break; } sort(client,client+n,cmp1); for(int i=0;i<n;++i) { int t = client[i].serveTime - client[i].time; if(client[i].serveTime == 0 ) continue; printf( "%02d:%02d:%02d %02d:%02d:%02d ",client[i].time/3600, client[i].time%3600/60,client[i].time%60,client[i].serveTime/3600, client[i].serveTime%3600/60,client[i].serveTime%60 ); cout << (t+30)/60 << endl; } cout << table[1].cnt; for(int i=2;i<=tableNum;++i) cout << " " << table[i].cnt; cout << endl; return 0; }