結果
| 問題 | No.3 ビットすごろく | 
| コンテスト | |
| ユーザー |  coco18000 | 
| 提出日時 | 2019-12-11 23:36:37 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 3 ms / 5,000 ms | 
| コード長 | 992 bytes | 
| コンパイル時間 | 1,726 ms | 
| コンパイル使用メモリ | 172,436 KB | 
| 実行使用メモリ | 6,944 KB | 
| 最終ジャッジ日時 | 2024-07-01 09:33:33 | 
| 合計ジャッジ時間 | 2,900 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 33 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> pll;
#define FOR(i, n, m) for(ll (i)=(m);(i)<(n);++(i))
#define REP(i, n) FOR(i,n,0)
#define OF64 std::setprecision(10)
const ll MOD = 1000000007;
const ll INF = (ll) 1e15;
ll dp[100005];
ll bitnum(ll n) {
    ll num = 0;
    while (n > 0) {
        num += (n & 1);
        n >>= 1;
    }
    return num;
}
int main() {
    ll N;
    cin >> N;
    REP(i, N + 1) {
        dp[i] = INF;
    }
    dp[1] = 1;
    queue<ll> q;
    q.push(1);
    while (!q.empty()) {
        ll t = q.front();
        q.pop();
        ll n = bitnum(t);
        if (t - n > 0 && dp[t - n] > dp[t] + 1) {
            dp[t - n] = dp[t] + 1;
            q.push(t - n);
        }
        if (t + n <= N && dp[t + n] > dp[t] + 1) {
            dp[t + n] = dp[t] + 1;
            q.push(t + n);
        }
    }
    if (dp[N] == INF)
        cout << -1 << endl;
    else
        cout << dp[N] << endl;
    return 0;
}
            
            
            
        