Processing math: 0%

2021年1月10日日曜日

TopCoder Single Round Match 797

0完ですがHack1成功でレートは若干プラス。

Div1 Easy FlightPlan

 使える高さを固定すれば、スタートからゴールまで最低何歩で行けるかはBFSで書けるので、高さを全探索すれば良い。ただ、O(N^4)をPythonで通すのは無理。頑張ってC++を書いたものの、システムテストで落ちてしまった。

 注意すべきは二点。

・(BFSの書き方にもよるけど)スタート地点が全探索時の高さより高いときバグる可能性がある。
・オーバーフロー。全探索する高さをintにしていたら、高さ*cupなどの計算でオーバーフローしていた。

 この二つに引っ掛かってたのでダメ。特に一点目は、Pythonで書いててもミスってた可能性がありますね……。



 以下、システムテストを通ったコード。

  1. #include <bits/stdc++.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. class FlightPlan
  6. {
  7. public:
  8. long long fly(int R, int C, vector<int> H, int cup, int cdn, int clr)
  9. {
  10. set<long long> S;
  11. S.clear();
  12. vector<long long> DP(R * C);
  13.  
  14. for (int i = 0; i < R * C; i += 1)
  15. {
  16. DP[i] = 9999;
  17. S.insert(H[i]);
  18. }
  19. DP[0] = 0;
  20.  
  21. long long ANS = 1000000000000000000;
  22.  
  23. for (auto s : S)
  24. {
  25. if (s < H[0])
  26. {
  27. continue;
  28. }
  29. if (s < H[R * C - 1])
  30. {
  31. continue;
  32. }
  33. deque<int> Q;
  34. Q.push_back(0);
  35.  
  36. for (int i = 0; i < R * C; i += 1)
  37. {
  38. DP[i] = 9999;
  39. }
  40. DP[0] = 0;
  41.  
  42. while (Q.size())
  43. {
  44. int x = Q.front();
  45. Q.pop_front();
  46. int r = x / C;
  47. int c = x % C;
  48.  
  49. if (r + 1 < R && H[(r + 1) * C + c] <= s && DP[(r + 1) * C + c] > DP[r * C + c] + 1)
  50. {
  51. DP[(r + 1) * C + c] = DP[r * C + c] + 1;
  52. Q.push_back((r + 1) * C + c);
  53. }
  54.  
  55. if (r - 1 >= 0 && H[(r - 1) * C + c] <= s && DP[(r - 1) * C + c] > DP[r * C + c] + 1)
  56. {
  57. DP[(r - 1) * C + c] = DP[r * C + c] + 1;
  58. Q.push_back((r - 1) * C + c);
  59. }
  60.  
  61. if (c + 1 < C && H[r * C + c + 1] <= s && DP[r * C + c + 1] > DP[r * C + c] + 1)
  62. {
  63. DP[r * C + c + 1] = DP[r * C + c] + 1;
  64. Q.push_back(r * C + c + 1);
  65. }
  66.  
  67. if (c - 1 >= 0 && H[r * C + c - 1] <= s && DP[r * C + c - 1] > DP[r * C + c] + 1)
  68. {
  69. DP[r * C + c - 1] = DP[r * C + c] + 1;
  70. Q.push_back(r * C + c - 1);
  71. }
  72.  
  73. if (DP[(R - 1) * C + C - 1] < 9999)
  74. {
  75. long long ANSX = 0;
  76. ANSX += (s - H[0]) * cup;
  77. ANSX += (s - H[(R - 1) * C + C - 1]) * cdn;
  78. ANSX += DP[(R - 1) * C + C - 1] * clr;
  79.  
  80. if (ANS > ANSX)
  81. {
  82. ANS = ANSX;
  83. }
  84. }
  85. }
  86. }
  87. return ANS;
  88. }
  89. };

0 件のコメント:

コメントを投稿