結果
問題 | No.3 ビットすごろく |
ユーザー |
![]() |
提出日時 | 2018-10-01 00:08:36 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,224 bytes |
コンパイル時間 | 841 ms |
コンパイル使用メモリ | 79,912 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-01 09:07:29 |
合計ジャッジ時間 | 1,715 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 33 |
ソースコード
#include <algorithm>#include <iostream>#include <queue>#include <string>#include <vector>using namespace std;static int count_bits(int i){auto b = 0;while (i > 0) {if (i & 0x01) ++b;i >>= 1;}return b;}struct Move{int pos;int count;};static void run(){int n;cin >> n;vector<int> bits(n + 1, 0);for (auto i = 1; i <= n; ++i) {bits[i] = count_bits(i);}vector<bool> done(n + 1, false);queue<Move> q;q.push(Move{1, 1});const auto kCannotReach = 10001;int result = kCannotReach;while (!q.empty()) {const auto move = q.front();q.pop();if (move.pos == n) {result = min(result, move.count);continue;}if (move.pos < 1 || move.pos > n || done[move.pos]) {result = min(result, kCannotReach);continue;}done[move.pos] = true;q.push(Move{move.pos + bits[move.pos], move.count + 1});q.push(Move{move.pos - bits[move.pos], move.count + 1});}cout << (result == kCannotReach ? -1 : result) << endl;}int main(int argc, char **argv){run();return 0;}