TopCoder SRM 523 DIV2
Rating: 1143(緑)→1156(緑)
いろいろとしくじった。Challenge大荒れの回だった。
229.78 Point
250: AlphabetPath
#include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; class AlphabetPath { private: bool isValid(int x, int y, vector<string>& maze) { return 0 <= x && x < maze.size() && 0 <= y && y < maze[0].size(); } public: string doesItExist(vector <string> letterMaze) { int sx = -1, sy; for (int i = 0; i < letterMaze.size(); ++i) { for (int j = 0; j < letterMaze[i].size(); ++j) { if (letterMaze[i][j] == 'A') { sx = i, sy = j; break; } } if (sx != -1) break; } const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1}; int cx = sx, cy = sy; bool f = true; for (int i = 'B'; i <= 'Z'; ++i) { bool g = false; for (int j = 0; j < 4; ++j) { const int nx = cx + dx[j], ny = cy + dy[j]; if (!isValid(nx, ny, letterMaze)) continue; if (letterMaze[nx][ny] == i) { g = true; cx = nx, cy = ny; break; } } if (!g) { f = false; break; } } return string(f ? "YES" : "NO"); } };
229.78 Point
2次元平面上に並ぶABCD....ZをAからはじめて隣接するマスを辿って順にZまでいけるかどうかを判定しろという問題。
問題をざっと聞いただけで分かると思うが、どう聞いても実装が重い。250の実装量では絶対ない。450ぐらいが妥当ではないだろうか。
500: CountingSeries
(あとでACした人のソースをチラチラ見ながら書いたソース)
#include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; class CountingSeries { public: long long countThem(long long a, long long b, long long c, long long d, long long upperBound) { long long res = 0; if (a <= upperBound) res += (upperBound - a) / b + 1; for (long long y = c; y <= upperBound; y *= d, y = (d == 1 ? upperBound + 1 : y)) { if ((y - a) % b || y < a) res++; } return res; } };
結論から言えばチャレンジされた。
全般的に今回の一大反省を要する問題。問題文の条件をそもそも大誤読した上に、グラフを描かない悪癖がたたって、脳内で謬論に基く実装が出来上がってしまい、しかもそれが非常に重かった。実装が終わりかけた頃にこれでは解けないというのに気付いて、ついでに問題文を再び誤読して、絶対にTLEする解法を送った。正直ねぼけていたという事にしたい。
1000:
時間なかった