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 }
代码有很多可以优化的地方,但是思路很清晰!

浙公网安备 33010602011771号