Poj 1025

传送门

一个模拟题,代码量真的很大,比较考细节

给每一个特工设置时间点,每次循环查看当前时间点最小的特工,根据当前楼层和下一个房间判断下一个动作是进房间还是电梯。每个房间和电梯都设置可使用时间,根据当前时间点和可使用时间判断是否需要排队,若排队,时间点设置为可使用时间,进入下一次循环。不排队,进入房间,房间时间设置为当前时间点+待在房间里的时间

细节很多就不一一写了。

最后注意电梯在每个5的整数倍时间可以进入。输出是按照优先级排列。

  1 #include<iostream>
  2 #include<string>
  3 #include<cstring>
  4 using namespace std;
  5 
  6 struct List{
  7     int type;
  8     int begin;
  9     int end;
 10     int floor;
 11     int room;
 12 };
 13 /* 
 14 1:进入 floor==0,room==0 
 15 2:待在房间/电梯 电梯(room==10) 
 16 3:转移 floor==0,room==0 
 17 4:排队 房间/电梯 电梯(room==10)
 18 5:退出 floor==0,room==0 
 19 */
 20 
 21 struct Agent{
 22     int num;
 23     int flag;
 24     int enter_time;
 25     int stay_time[10][10]; 
 26     int current_time;
 27     int current_floor;
 28     int current_room;
 29     int last_floor;
 30     int last_room;
 31     int cur_n;
 32     List list[100];
 33 };
 34 
 35 Agent agent[26];
 36 int Room[10][10];
 37 int elevator[10];
 38 int k;
 39 int n;
 40 
 41 void printtime(int t){
 42     int hour=t/3600;
 43     int min=t%3600/60;
 44     int sec=t%60;
 45     if(hour<10){
 46         cout<<'0';
 47     }
 48     cout<<hour<<':';
 49     if(min<10){
 50         cout<<'0';
 51     }
 52     cout<<min<<':';
 53     if(sec<10){
 54         cout<<'0';
 55     }
 56     cout<<sec;
 57 }
 58 
 59 void printroom(int f,int r){
 60     if(r==10){
 61         cout<<"elevator";
 62         return;
 63     }
 64     cout<<"room ";
 65     if(f+1<10){
 66         cout<<'0';
 67     }
 68     cout<<f+1;
 69     if(r+1<10){
 70         cout<<'0';
 71     }
 72     cout<<r+1;
 73 }
 74 
 75 int main(){
 76     char C;
 77     string time;
 78     cin>>C;
 79     memset(agent,0,sizeof(agent));
 80     memset(Room,0,sizeof(Room));
 81     memset(elevator,0,sizeof(elevator));
 82     k=0;
 83     while(C!='.'){
 84         cin>>time;
 85         k++;
 86         agent[C-'A'].flag=1;
 87         agent[C-'A'].num=k;
 88         int entertime=((time[0]-'0')*10+(time[1]-'0'))*3600+((time[3]-'0')*10+(time[4]-'0'))*60+((time[6]-'0')*10+(time[7]-'0'));
 89         agent[C-'A'].enter_time=entertime;
 90         agent[C-'A'].list[agent[C-'A'].cur_n].type=1;
 91         agent[C-'A'].list[agent[C-'A'].cur_n].begin=entertime;
 92         agent[C-'A'].current_time=entertime+30;
 93         agent[C-'A'].list[agent[C-'A'].cur_n].end=entertime+30;
 94         agent[C-'A'].cur_n++;
 95         string room;
 96         cin>>room;
 97         while(room!="0"){
 98             int staytime;
 99             cin>>staytime;
100             agent[C-'A'].stay_time[(room[0]-'0')*10+(room[1]-'0')-1][(room[2]-'0')*10+(room[3]-'0')-1]=staytime;
101             agent[C-'A'].last_floor=(room[0]-'0')*10+(room[1]-'0')-1;
102             agent[C-'A'].last_room=(room[2]-'0')*10+(room[3]-'0')-1;
103             cin>>room;
104         }
105         cin>>C;
106     }
107     n=k;
108     bool next;
109     while(k){
110         int mintime=90000;
111         int curagent=0;
112         for(int i=0;i<26;i++){
113             if(agent[i].flag==1&&agent[i].current_time<mintime){
114                 mintime=agent[i].current_time;
115                 curagent=i;
116             }
117         }
118         int i,j;
119         next=false;
120         for(i=0;i<10;i++){
121             for(j=0;j<10;j++){
122                 if(agent[curagent].stay_time[i][j]){//判断下一个房间 
123                     if(i==agent[curagent].current_floor&&Room[i][j]<=agent[curagent].current_time){//该房间可以进入 
124                         agent[curagent].list[agent[curagent].cur_n].type=2;
125                         agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
126                         agent[curagent].list[agent[curagent].cur_n].floor=i;
127                         agent[curagent].list[agent[curagent].cur_n].room=j;
128                         agent[curagent].current_time+=agent[curagent].stay_time[i][j];
129                         agent[curagent].stay_time[i][j]=0;
130                         agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
131                         agent[curagent].cur_n++;
132                         Room[i][j]=agent[curagent].current_time;
133                         agent[curagent].current_room=j+1;
134                         if(agent[curagent].last_floor==i&&agent[curagent].last_room==j&&i==0){//最后一个房间且在一楼 可以直接退出 
135                             agent[curagent].list[agent[curagent].cur_n].type=5;
136                             agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
137                             agent[curagent].current_time+=30;
138                             agent[curagent].flag=0;
139                             k--;
140                             agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
141                             agent[curagent].cur_n++;
142                         }
143                         else{//走到电梯口或下一个房间门口 
144                             agent[curagent].list[agent[curagent].cur_n].type=3;
145                             agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
146                             agent[curagent].current_time+=10;
147                             agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
148                             agent[curagent].cur_n++;
149                         }
150                         next=true;
151                         break;
152                     }
153                     else if(i==agent[curagent].current_floor&&Room[i][j]>agent[curagent].current_time){//等待房间 
154                         if(agent[curagent].list[agent[curagent].cur_n-1].type==4){//上一个阶段也为等待 
155                             agent[curagent].list[agent[curagent].cur_n-1].end=Room[i][j];
156                         }
157                         else{
158                             agent[curagent].list[agent[curagent].cur_n].type=4;
159                             agent[curagent].list[agent[curagent].cur_n].floor=i;
160                             agent[curagent].list[agent[curagent].cur_n].room=j;
161                             agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
162                             agent[curagent].list[agent[curagent].cur_n].end=Room[i][j];
163                             agent[curagent].cur_n++;
164                         }
165                         agent[curagent].current_time=Room[i][j];
166                         next=true;
167                         break;
168                     }
169                     else if(i!=agent[curagent].current_floor&&elevator[agent[curagent].current_floor]<=agent[curagent].current_time){//乘坐电梯 
170                         if(agent[curagent].current_time%5!=0){//等待电梯整点 
171                             if(agent[curagent].list[agent[curagent].cur_n-1].type==4){
172                                 agent[curagent].list[agent[curagent].cur_n-1].end=(agent[curagent].current_time/5+1)*5;
173                             }
174                             else{
175                                 agent[curagent].list[agent[curagent].cur_n].type=4;
176                                 agent[curagent].list[agent[curagent].cur_n].floor=agent[curagent].current_floor;
177                                 agent[curagent].list[agent[curagent].cur_n].room=10;
178                                 agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
179                                 agent[curagent].list[agent[curagent].cur_n].end=(agent[curagent].current_time/5+1)*5;
180                                 agent[curagent].cur_n++;
181                             }
182                             agent[curagent].current_time=(agent[curagent].current_time/5+1)*5;
183                             agent[curagent].cur_n++;                        
184                         } 
185                         agent[curagent].list[agent[curagent].cur_n].type=2;
186                         agent[curagent].list[agent[curagent].cur_n].floor=agent[curagent].current_floor;
187                         agent[curagent].list[agent[curagent].cur_n].room=10;
188                         agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;            
189                         elevator[agent[curagent].current_floor]=agent[curagent].current_time+5;
190                         agent[curagent].current_time+=(i-agent[curagent].current_floor)*30;
191                         agent[curagent].current_floor=i;
192                         agent[curagent].current_room=0;
193                         agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
194                         agent[curagent].cur_n++;
195                         
196                         agent[curagent].list[agent[curagent].cur_n].type=3;
197                         agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;            
198                         agent[curagent].current_time+=10;
199                         agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
200                         agent[curagent].cur_n++;
201                         next=true;
202                         break;
203                     }
204                     else if(i!=agent[curagent].current_floor&&elevator[agent[curagent].current_floor]>agent[curagent].current_time){//等待电梯 
205                         if(agent[curagent].list[agent[curagent].cur_n-1].type==4){
206                             agent[curagent].list[agent[curagent].cur_n-1].end=elevator[agent[curagent].current_floor];
207                         }
208                         else{
209                             agent[curagent].list[agent[curagent].cur_n].type=4;
210                             agent[curagent].list[agent[curagent].cur_n].floor=agent[curagent].current_floor;
211                             agent[curagent].list[agent[curagent].cur_n].room=10;
212                             agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
213                             agent[curagent].list[agent[curagent].cur_n].end=elevator[agent[curagent].current_floor];
214                             agent[curagent].cur_n++;
215                         }    
216                         agent[curagent].current_time=elevator[agent[curagent].current_floor];    
217                         next=true;    
218                         break;            
219                     }
220                 }
221             }
222             if(next){
223                 break;
224             }
225         }
226         if(next){
227             continue;
228         }
229         if(i==10&&j==10&&elevator[agent[curagent].current_floor]<=agent[curagent].current_time){//所有房间都已走完且不在一楼 
230             if(agent[curagent].current_time%5!=0){//等待电梯整点 
231                 if(agent[curagent].list[agent[curagent].cur_n-1].type==4){
232                     agent[curagent].list[agent[curagent].cur_n-1].end=(agent[curagent].current_time/5+1)*5;
233                 }
234                 else{
235                     agent[curagent].list[agent[curagent].cur_n].type=4;
236                     agent[curagent].list[agent[curagent].cur_n].floor=agent[curagent].current_floor;
237                     agent[curagent].list[agent[curagent].cur_n].room=10;
238                     agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
239                     agent[curagent].list[agent[curagent].cur_n].end=(agent[curagent].current_time/5+1)*5;
240                     agent[curagent].cur_n++;
241                 }    
242                 agent[curagent].current_time=(agent[curagent].current_time/5+1)*5;
243             } 
244             elevator[agent[curagent].current_floor]=agent[curagent].current_time+5;
245             agent[curagent].list[agent[curagent].cur_n].type=2;
246             agent[curagent].list[agent[curagent].cur_n].floor=agent[curagent].current_floor;
247             agent[curagent].list[agent[curagent].cur_n].room=10;
248             agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;            
249             agent[curagent].current_time+=agent[curagent].current_floor*30;
250             agent[curagent].flag=0;
251             k--;
252             agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
253             agent[curagent].cur_n++;
254             agent[curagent].list[agent[curagent].cur_n].type=5;
255             agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;            
256             agent[curagent].current_time+=30;
257             agent[curagent].list[agent[curagent].cur_n].end=agent[curagent].current_time;
258             agent[curagent].cur_n++;
259         }
260         else{//等待电梯 
261             if(agent[curagent].list[agent[curagent].cur_n-1].type==4){
262                 agent[curagent].list[agent[curagent].cur_n-1].end=elevator[agent[curagent].current_floor];
263             }
264             else{
265                 agent[curagent].list[agent[curagent].cur_n].type=4;
266                 agent[curagent].list[agent[curagent].cur_n].floor=agent[curagent].current_floor;
267                 agent[curagent].list[agent[curagent].cur_n].room=10;
268                 agent[curagent].list[agent[curagent].cur_n].begin=agent[curagent].current_time;
269                 agent[curagent].list[agent[curagent].cur_n].end=elevator[agent[curagent].current_floor];
270                 agent[curagent].cur_n++;
271             }    
272             agent[curagent].current_time=elevator[agent[curagent].current_floor];
273         }
274     }
275     for(int j=0;j<26;j++){
276         if(agent[j].num!=0){
277             cout<<char('A'+j)<<endl;
278             for(int k=0;k<agent[j].cur_n;k++){
279                 switch(agent[j].list[k].type){
280                     case 1:
281                         printtime(agent[j].list[k].begin);
282                         cout<<' ';
283                         printtime(agent[j].list[k].end);
284                         cout<<" Entry"<<endl;
285                         break;
286                     case 2:
287                         printtime(agent[j].list[k].begin);
288                         cout<<' ';
289                         printtime(agent[j].list[k].end);
290                         cout<<" Stay in ";
291                         printroom(agent[j].list[k].floor,agent[j].list[k].room);
292                         cout<<endl;
293                         break;
294                     case 3:
295                         printtime(agent[j].list[k-1].end);
296                         cout<<' ';
297                         printtime(agent[j].list[k+1].begin);
298                         cout<<" Transfer from ";
299                         printroom(agent[j].list[k-1].floor,agent[j].list[k-1].room);
300                         cout<<" to ";
301                         printroom(agent[j].list[k+1].floor,agent[j].list[k+1].room);
302                         cout<<endl;
303                         break;
304                     case 4:
305                         printtime(agent[j].list[k].begin);
306                         cout<<' ';
307                         printtime(agent[j].list[k].end);
308                         if(agent[j].list[k].room==10){
309                             cout<<" Waiting in ";
310                             printroom(agent[j].list[k].floor,agent[j].list[k].room);
311                             cout<<" queue";
312                         }
313                         else{
314                             cout<<" Waiting in front of ";
315                             printroom(agent[j].list[k].floor,agent[j].list[k].room);
316                         }
317                         cout<<endl;
318                         break;
319                     case 5:
320                         printtime(agent[j].list[k].begin);
321                         cout<<' ';
322                         printtime(agent[j].list[k].end);
323                         cout<<" Exit"<<endl;
324                         break;
325                 }
326             }    
327             cout<<endl;
328         }
329     }
330 }

 

posted @ 2017-06-14 15:36  水野玛琳  阅读(175)  评论(0编辑  收藏  举报