0完ですがHack1成功でレートは若干プラス。
Div1 Easy FlightPlan
使える高さを固定すれば、スタートからゴールまで最低何歩で行けるかはBFSで書けるので、高さを全探索すれば良い。ただ、O(N^4)をPythonで通すのは無理。頑張ってC++を書いたものの、システムテストで落ちてしまった。
注意すべきは二点。
・(BFSの書き方にもよるけど)スタート地点が全探索時の高さより高いときバグる可能性がある。
・オーバーフロー。全探索する高さをintにしていたら、高さ*cupなどの計算でオーバーフローしていた。
この二つに引っ掛かってたのでダメ。特に一点目は、Pythonで書いててもミスってた可能性がありますね……。
- #include <bits/stdc++.h>
- #include <bits/stdc++.h>
- using namespace std;
- class FlightPlan
- {
- public:
- long long fly(int R, int C, vector<int> H, int cup, int cdn, int clr)
- {
- set<long long> S;
- S.clear();
- vector<long long> DP(R * C);
- for (int i = 0; i < R * C; i += 1)
- {
- DP[i] = 9999;
- S.insert(H[i]);
- }
- DP[0] = 0;
- long long ANS = 1000000000000000000;
- for (auto s : S)
- {
- if (s < H[0])
- {
- continue;
- }
- if (s < H[R * C - 1])
- {
- continue;
- }
- deque<int> Q;
- Q.push_back(0);
- for (int i = 0; i < R * C; i += 1)
- {
- DP[i] = 9999;
- }
- DP[0] = 0;
- while (Q.size())
- {
- int x = Q.front();
- Q.pop_front();
- int r = x / C;
- int c = x % C;
- if (r + 1 < R && H[(r + 1) * C + c] <= s && DP[(r + 1) * C + c] > DP[r * C + c] + 1)
- {
- DP[(r + 1) * C + c] = DP[r * C + c] + 1;
- Q.push_back((r + 1) * C + c);
- }
- if (r - 1 >= 0 && H[(r - 1) * C + c] <= s && DP[(r - 1) * C + c] > DP[r * C + c] + 1)
- {
- DP[(r - 1) * C + c] = DP[r * C + c] + 1;
- Q.push_back((r - 1) * C + c);
- }
- if (c + 1 < C && H[r * C + c + 1] <= s && DP[r * C + c + 1] > DP[r * C + c] + 1)
- {
- DP[r * C + c + 1] = DP[r * C + c] + 1;
- Q.push_back(r * C + c + 1);
- }
- if (c - 1 >= 0 && H[r * C + c - 1] <= s && DP[r * C + c - 1] > DP[r * C + c] + 1)
- {
- DP[r * C + c - 1] = DP[r * C + c] + 1;
- Q.push_back(r * C + c - 1);
- }
- if (DP[(R - 1) * C + C - 1] < 9999)
- {
- long long ANSX = 0;
- ANSX += (s - H[0]) * cup;
- ANSX += (s - H[(R - 1) * C + C - 1]) * cdn;
- ANSX += DP[(R - 1) * C + C - 1] * clr;
- if (ANS > ANSX)
- {
- ANS = ANSX;
- }
- }
- }
- }
- return ANS;
- }
- };
0 件のコメント:
コメントを投稿