Source code for submission s1021

Go to diff to previous submission

ants.cpp

  1. #include <stdio.h>
  2. #include <deque>
  3. #include <algorithm>
  4.  
  5. #define MAX(x, y) ((x) >= (y) ? (x) : (y))
  6. #define ABS(x) ((x) >= 0 ? (x) : (-(x)))
  7.  
  8. using namespace std;
  9.  
  10. struct Ant {
  11. int pos;
  12. char dir;
  13. };
  14.  
  15. bool cmp(const Ant &a, const Ant &b) {
  16. return a.pos < b.pos;
  17. }
  18.  
  19. int main() {
  20. int l, count, i;
  21.  
  22. newInstance:
  23. while (scanf("%d %d\n", &l, &count) != EOF) {
  24. deque<Ant> q;
  25.  
  26. int maxDist = -1;
  27. for (i = 0; i < count; ++i) {
  28. Ant ant;
  29. scanf("%d %c\n", &(ant.pos), &(ant.dir));
  30. q.push_back(ant);
  31.  
  32. if (ant.dir == 'R')
  33. maxDist = MAX(ABS(l - ant.pos), maxDist);
  34. else
  35. maxDist = MAX(ant.pos, maxDist);
  36. }
  37.  
  38. sort(q.begin(), q.end(), cmp);
  39.  
  40. while (q.size() > 2) {
  41. Ant a = q.front();
  42. Ant b = q.back();
  43. q.pop_front();
  44.  
  45. if (a.dir == 'R' && q.front().dir == 'L') {
  46. q.front().dir = 'R';
  47. } else if (a.dir == 'R' && q.front().dir == 'R') {
  48. size_t j = 1;
  49. while (j < q.size() - 1 && q[j].dir == 'R')
  50. ++j;
  51.  
  52. if (q[j].dir == 'L') {
  53. int k = j;
  54. while (j < q.size() - 1 && q[j].dir == 'L' && k > 0) {
  55. q.pop_front();
  56. --k;
  57. q[j].dir = 'R';
  58. ++j;
  59. }
  60. } else {
  61. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, a.pos);
  62. goto newInstance;
  63. }
  64. }
  65.  
  66. if (q.size() == 2)
  67. goto twoOrOne;
  68.  
  69. q.pop_back();
  70.  
  71. if (b.dir == 'L' && q.back().dir == 'R') {
  72. q.back().dir = 'L';
  73. } else if (b.dir == 'L' && q.back().dir == 'L') {
  74. int j = q.size() - 2;
  75. while (j > 0 && q[j].dir == 'L')
  76. --j;
  77.  
  78. if (q[j].dir == 'R') {
  79. int k = j;
  80. while (j > 0 && q[j].dir == 'R' && k > 0) {
  81. q.pop_back();
  82. --k;
  83. q[j].dir = 'L';
  84. --j;
  85. }
  86. } else {
  87. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, b.pos);
  88. goto newInstance;
  89. }
  90. }
  91. }
  92.  
  93. twoOrOne:
  94. if (q.size() == 1) {
  95. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, q.front().pos);
  96. } else if (q.front().dir == 'R' && q.back().dir == 'R') {
  97. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, q.front().pos);
  98. } else if (q.front().dir == 'L' && q.back().dir == 'L') {
  99. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, q.back().pos);
  100. } else {
  101. int dist1 = q.front().pos;
  102. int dist2 = l - q.back().pos;
  103. int diff = dist1 - dist2;
  104. if (diff > 0)
  105. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, q.front().pos);
  106. else if (diff < 0)
  107. printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, q.back().pos);
  108. else
  109. printf("The last ant will fall down in %d seconds - started at %d and %d.\n", maxDist, q.front().pos, q.back().pos);
  110. }
  111. }
  112.  
  113. return 0;
  114. }
  115.  

Diff to submission s858

ants.cpp

--- c4.s858.cteam006.ants.cpp.0.ants.cpp
+++ c4.s1021.cteam006.ants.cpp.0.ants.cpp
@@ -49,6 +49,13 @@
                                 while (j < q.size() - 1 && q[j].dir == 'R')
                                         ++j;
+                                
                                 if (q[j].dir == 'L') {
-                                        q[j].dir = 'R';
+                                        int k = j;
+                                        while (j < q.size() - 1 && q[j].dir == 'L' && k > 0) {
+                                                q.pop_front();
+                                                --k;
+                                                q[j].dir = 'R';
+                                                ++j;
+                                        }
                                 } else {
                                         printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, a.pos);
@@ -68,6 +75,13 @@
                                 while (j > 0 && q[j].dir == 'L')
                                         --j;
+                                
                                 if (q[j].dir == 'R') {
-                                        q[j].dir = 'L';
+                                        int k = j;
+                                        while (j > 0 && q[j].dir == 'R' && k > 0) {
+                                                q.pop_back();
+                                                --k;
+                                                q[j].dir = 'L';
+                                                --j;
+                                        }
                                 } else {
                                         printf("The last ant will fall down in %d seconds - started at %d.\n", maxDist, b.pos);