PAT Table Tennis (30)

题目简介:

  A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For any pair of players, if there are some tables open when they arrive, they will be assigned to the available table with the smallest number. If all the tables are occupied, they will have to wait in a queue. It is assumed that every pair of players can play for at most 2 hours.
Your job is to count for everyone in queue their waiting time, and for each table the number of players it has served for the day.
  One thing that makes this procedure a bit complicated is that the club reserves some tables for their VIP members. When a VIP table is open, the first VIP pair in the queue will have the priviledge to take it. However, if there is no VIP in the queue, the next pair of players can take it. On the other hand, if when it is the turn of a VIP pair, yet no VIP table is available, they can be assigned as any ordinary players. 

  一个乒乓球俱乐部有N个台球桌子,编号1-N。对于到来的每一组玩家,提供可用的编号最小的桌子。如果没有空桌子就排队,规定每组玩家玩的时间不能超过两个小时

  让这个问题复杂的是这个俱乐部为VIP成员提供了一些VIP桌子。当一个VIP桌子可用的时候,在排队的人中如果有VIP成员,那么排队中的第一个VIP成员将优先获得服务的权。然而,如果没有VIP成员在等待,那么下一个玩家就可以使用VIP桌子。另一方面,当轮到VIP成员是,但是没有空闲的VIP桌子,那么这个VIP玩家将会被当做普通玩家进行分配乒乓球桌。

解题思路:

  1)按照题目的意思进行模拟。设定一个时间轴,然后每次时间发生变化时更新桌子的状态(flushTables),检查是否有VIP桌子,如果有就先服务VIP玩家(getPlayer),然后服务普通玩家(getPlayer);

  2)最后俱乐部关门的时候要强行终止正在玩的玩家;

代码:

  1 #include<iostream>
  2 #include<list>
  3 #include<vector>
  4 #include<algorithm>
  5 #include<math.h>
  6 using namespace std;
  7 #define OPEN_TIME 28800
  8 #define CLOSE_TIME 75600
  9 #define TWO_HOURS 7200
 10 struct Player
 11 {
 12     int arriveTime;
 13     int hour,minute,seconds;
 14     bool isVIP;
 15     int beginTime;
 16     int playTime;
 17     int endTime;
 18     bool served;
 19     bool operator <(const Player& a) const
 20     {
 21         return this->arriveTime<a.arriveTime;
 22     }
 23 };
 24 typedef vector<Player> PlayerQueue;
 25 struct Table
 26 {
 27     int id;
 28     int serveTimes;
 29     Player *curUser;
 30     bool isVIP;
 31     Table():curUser(NULL),isVIP(false),serveTimes(0){}
 32 };
 33 typedef vector<Table> Tables;
 34 bool cmp(const  Player &a,const  Player &b)
 35 {
 36     return a.beginTime<b.beginTime;
 37 }
 38 PlayerQueue::iterator getPlayer(const PlayerQueue::iterator begin,const PlayerQueue::iterator end,const int& curTime,bool isVIP)
 39 {
 40     PlayerQueue::iterator ele;
 41     int i,index=-1;
 42     if(isVIP)
 43     {
 44         for(ele=begin;ele!=end;ele++)
 45         {
 46             if(ele->served==false&&ele->arriveTime<=curTime)
 47             {
 48                 if(ele->isVIP)
 49                 {
 50                     return ele;//VIP
 51                 }
 52             }
 53         }
 54     }else
 55     {
 56         for(ele=begin;ele!=end;ele++)
 57         {
 58             if(ele->served==false&&ele->arriveTime<=curTime)
 59             {
 60                 return ele;//Normal
 61             }
 62         }
 63     }
 64     return end;//no player
 65 }
 66 void flushTables(const Tables::iterator& begin,const Tables::iterator& end,const int& curTime)
 67 {
 68     for(Tables::iterator ele=begin;ele!=end;ele++)
 69     {
 70         if(ele->curUser!=NULL)
 71         {
 72             if(curTime-ele->curUser->beginTime==ele->curUser->playTime||curTime==CLOSE_TIME)
 73             {
 74                 ele->curUser->endTime=curTime;//end play
 75                 ele->curUser=NULL;
 76             }
 77         }
 78     }
 79 }
 80 int main()
 81 {
 82     //freopen("in.txt","r",stdin);
 83     //freopen("out.txt","w",stdout);
 84     int n;
 85     scanf("%d",&n);
 86     PlayerQueue que(n);
 87     char str[10];
 88     int i;
 89     int h,m,s;
 90     for(i=0;i<n;i++)
 91     {
 92         scanf("%d:%d:%d%d%d",&que[i].hour,&que[i].minute,&que[i].seconds,&que[i].playTime,&que[i].isVIP);
 93         que[i].arriveTime=que[i].hour*3600+que[i].minute*60+que[i].seconds;
 94         que[i].playTime*=60;
 95         if(que[i].playTime>TWO_HOURS)
 96         {
 97             que[i].playTime=TWO_HOURS;
 98         }
 99         que[i].served=false;
100     }
101     sort(que.begin(),que.end());
102     int k,temp;
103     scanf("%d%d",&k,&m);
104     Tables tas(k);
105     for(temp=0;temp<k;temp++)
106     {
107         tas[temp].id=temp;
108     }
109     while(m--)
110     {
111         scanf("%d",&temp);
112         tas[temp-1].isVIP=true;
113     }
114     int curTime=OPEN_TIME;
115     const  Tables::iterator bt=tas.begin(),et=tas.end();
116     Tables::iterator ele;
117     const PlayerQueue::iterator bp=que.begin(),ep=que.end();
118     PlayerQueue::iterator elep;
119     vector<Player*> served;
120     while(curTime<CLOSE_TIME)
121     {
122         if(curTime==32400)
123         {
124             cout<<"";
125         }
126         flushTables(bt,et,curTime);
127         for(ele=bt;ele!=et;ele++)//distribute vip table
128         {
129             if(ele->curUser==NULL&&ele->isVIP)//empty vip table
130             {
131                 elep=getPlayer(bp,ep,curTime,true);
132                 if(elep!=ep)
133                 {
134                     ele->curUser=&(*elep);
135                     served.push_back(ele->curUser);
136                     elep->served=true;
137                     elep->beginTime=curTime;//begin play
138                     ele->serveTimes++;
139                 }
140                 else//no player
141                 {
142                     break;
143                 }
144             }
145         }
146         for(ele=bt;ele!=et;ele++)//distribute normal table
147         {
148             if(ele->curUser==NULL)//empty table
149             {
150                 elep=getPlayer(bp,ep,curTime,false);
151                 if(elep!=ep)
152                 {
153                     ele->curUser=&(*elep);
154                     served.push_back(ele->curUser);
155                     elep->served=true;
156                     elep->beginTime=curTime;//begin play
157                     //printf("%d\n",elep->arriveTime);
158                     ele->serveTimes++;
159                 }
160                 else//no player
161                 {
162                     break;
163                 }
164             }
165         }
166         curTime++;//timestamp
167     }
168     flushTables(bt,et,curTime);
169     vector<Player> result;
170     for(vector<Player*>::iterator sele=served.begin(),send=served.end();sele!=send;sele++)
171     {
172         result.push_back(*(*sele));
173     }
174     sort(result.begin(),result.end(),cmp);
175     vector<Player*>::iterator sele=served.begin(),send=served.end();
176     for(vector<Player>::iterator rele=result.begin(),rend=result.end();rele!=rend;rele++)
177     {
178         h=rele->arriveTime/3600;
179         m=(rele->arriveTime-h*3600)/60;
180         s=rele->arriveTime%60;
181         printf("%02d:%02d:%02d",h,m,s);
182         h=rele->beginTime/3600;
183         m=(rele->beginTime-h*3600)/60;
184         s=rele->beginTime%60;
185         printf(" %02d:%02d:%02d %d\n",h,m,s,int((rele->beginTime-rele->arriveTime)/60.0+0.5));
186     }
187     bool first=true;
188     for(ele=tas.begin();ele!=tas.end();ele++)
189     {
190         if(first)
191         {
192             first=!first;
193             printf("%d",ele->serveTimes);
194         }
195         else
196         {
197             printf(" %d",ele->serveTimes);
198         }
199     }
200     return 0;
201 }

代码有很多可以优化的地方,但是思路很清晰!

posted @ 2016-11-21 11:38  冠king  阅读(147)  评论(0)    收藏  举报