牛客网上过了,pat练题 18 分。所以关于题目大意和解题思路可能有些不对。。。
吐槽下:这题坑好多,有多个方面的细节题目都没说清。真心花了很多时间,但还是不知道自己哪错了。。。
题目链接:https://www.patest.cn/contests/pat-a-practise/1026
#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;
}