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 }