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 件のコメント:
コメントを投稿