PAT-1026 Table Tennis (30)

牛客网上过了,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;
}

猜你喜欢

转载自blog.csdn.net/zhoujian_1943/article/details/79393938