列车调度(Train)
Description
Figure 1 shows the structure of a station for train dispatching.
Figure 1
In this station, A is the entrance for each train and B is the exit. S is the transfer end. All single tracks are one-way, which means that the train can enter the station from A to S, and pull out from S to B. Note that the overtaking is not allowed. Because the compartments can reside in S, the order that they pull out at B may differ from that they enter at A. However, because of the limited capacity of S, no more that m compartments can reside at S simultaneously.
Assume that a train consist of n compartments labeled {1, 2, …, n}. A dispatcher wants to know whether these compartments can pull out at B in the order of {a1, a2, …, an} (a sequence). If can, in what order he should operate it?
Input
Two lines:
1st line: two integers n and m;
2nd line: n integers separated by spaces, which is a permutation of {1, 2, …, n}. This is a compartment sequence that is to be judged regarding the feasibility.
Output
If the sequence is feasible, output the sequence. “Push” means one compartment goes from A to S, while “pop” means one compartment goes from S to B. Each operation takes up one line.
If the sequence is infeasible, output a “no”.
Example 1
Input
5 2
1 2 3 5 4
Output
push
pop
push
pop
push
pop
push
push
pop
pop
Example 2
Input
5 5
3 1 2 4 5
Output
No
Restrictions
1 <= n <= 1,600,000
0 <= m <= 1,600,000
Time: 2 sec
Memory: 256 MB
感觉很简单的题目,就是难以下手,还是自己不行,加油吧!
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 6 const int MAX_SIZE = 1600000 + 10; 7 int Stack1[MAX_SIZE], Stack2[MAX_SIZE]; 8 int out[MAX_SIZE]; 9 int pointer = 0; 10 11 void push(int a) 12 { 13 pointer++; 14 Stack1[pointer] = a; 15 Stack2[pointer] = a; 16 } 17 18 void pop() 19 { 20 pointer--; 21 } 22 23 int top1() 24 { 25 return Stack1[pointer]; 26 } 27 28 int top2() 29 { 30 return Stack2[pointer]; 31 } 32 33 int main() 34 { 35 int n, m; 36 scanf("%d %d", &n, &m); 37 38 for(int i = 1; i <= n; ++i) 39 { 40 scanf("%d", &out[i]); 41 } 42 43 int j = 0; 44 for(int i = 1; i <= n; ++i) 45 { 46 ///3个if 1个while 就模拟了栈混洗过程 47 if(out[i] < top1()) 48 { 49 printf("No"); 50 return 0; 51 } 52 53 while(j < out[i]) 54 { 55 push(++j); 56 printf("push(%d)\n", j); 57 } 58 59 if(m < pointer) 60 { 61 printf("No"); 62 return 0; 63 } 64 65 if(out[i] == top1()) 66 { 67 printf("pop\n"); 68 pop(); 69 } 70 } 71 72 j = 0; 73 for(int i = 1; i <= n; ++i) 74 { 75 while(j < out[i]) 76 { 77 push(++j); 78 puts("push"); 79 } 80 81 if(out[i] == top2()) 82 { 83 pop(); 84 puts("pop"); 85 } 86 } 87 return 0; 88 }