結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-11-13 19:46:07 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 46 ms / 5,000 ms |
| コード長 | 951 bytes |
| コンパイル時間 | 568 ms |
| コンパイル使用メモリ | 64,028 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-01 07:34:55 |
| 合計ジャッジ時間 | 1,911 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
#include <iostream>
#include <vector>
int num_of_1(const int &n) {
if (n == 0) {
return 0;
}else{
return num_of_1(n >> 1) + (n & 1);
}
}
class Cell {
public:
Cell() :vector(0),dist(100000) {};
void add_prev(Cell* other) {
vector.push_back(other);
}
void solve(const int &count = 1) {
if (dist > count) {
dist = count;
for (auto &cell : vector) {
cell->solve(count + 1);
}
}
}
int get_dist() {
return dist;
}
private:
std::vector<Cell*> vector;
int dist;
};
int main() {
int n;
std::cin >> n;
std::vector < Cell> vector(n);
for (auto i = 0; i < n; ++i) {
auto step = num_of_1(i + 1);
if (i - step > 0) {
vector.at(i - step).add_prev(&vector.at(i));
}
if (i + step < n) {
vector.at(i + step).add_prev(&vector.at(i));
}
}
vector.at(n - 1).solve();
if (vector.at(0).get_dist() > n) {
std::cout << -1 << std::endl;
}
else {
std::cout << vector.at(0).get_dist() << std::endl;
}
return 0;
}