結果
| 問題 | No.3 ビットすごろく | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2017-12-08 19:27:16 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 3 ms / 5,000 ms | 
| コード長 | 767 bytes | 
| コンパイル時間 | 1,412 ms | 
| コンパイル使用メモリ | 165,248 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-01 08:52:46 | 
| 合計ジャッジ時間 | 2,400 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 33 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int INF = 1e9;
int d[10010];
vector<int> G[10010];
int main(void) {
  int n;
  cin >> n;
  for (int i = 1; i < n; i++) {
    int cnt = __builtin_popcount(i);
    if (i - cnt >= 1) G[i].push_back(i - cnt);
    if (i + cnt <= n) G[i].push_back(i + cnt);
  }
  queue<pii> que;
  fill(d, d + n + 1, INF);
  d[1] = 1;
  que.push(pii(1, 1));
  while (!que.empty()) {
    pii p = que.front(); que.pop();
    int v = p.second;
    if (d[v] < p.first) continue;
    for (int i = 0; i < G[v].size(); i++) {
      int w = G[v][i];
      if (d[w] <= d[v] + 1) continue;
      d[w] = d[v] + 1;
      que.push(pii(d[w], w));
    }
  }
  cout << (d[n] == INF ? -1 : d[n]) << endl;
  
  return 0;
}
            
            
            
        