// yukicodr // No.3 //二次元可変配列 //vector > mass; //vector > memo; //vector memo; //#include "stdafx.h" #include #include #include //list #include //queue #include //tree #include //連想配列 #include //hash #include //hash #include #include #include #include //#include using namespace std; #define FOR(x,to) for(x=0;x(b)?(a):(b)) #define FMIN(a,b) ((a)<(b)?(a):(b)) #define FCEIL(a,b) ((a)+(b)-1)/(b) typedef unsigned long long ULL; typedef signed long long SLL; int N; queue _queue; int bi[10005]; //二進数の1の数を保存している int flag[10005]; //一度通ったら1にする int cost[10005]; //添え字の番号の時点までのコストを記憶 int main() { cin >> N; for (int i = 0; i <= N; i++) { int count = 0; //2進数でどれだけ動けるか計算 for (int n = 0; n < 16; n++)//10000なので2^16以下でOK { if (i &(1 << n)) { count++; } } bi[i] = count; } int k; flag[1] = 1; cost[1] = 1; _queue.push(1); int ans = -1; while (_queue.empty()!=1) { //先頭を見る k = _queue.front(); //先頭を取り除く _queue.pop(); int target; //自分の数に自分の数の二進数で進める数を加えてみる target = k + bi[k]; if (flag[target] == 0 && (target <= N)) //行けるかどうか { flag[target] = 1; //行けた cost[target] = cost[k] + 1; // _queue.emplace(target); //行けたとしてキューに入れる } //自分の数に自分の数の二進数で進める数を引いてみる target = k - bi[k]; if (flag[target] == 0 && (target > 0)) //いけるかどうか  { flag[target] = 1; //行けた cost[target] = cost[k] + 1; _queue.emplace(target); //行けたとしてキューに入れる } } if (cost[N]>0) cout << cost[N]; else cout << -1 << endl; //getchar(); return 0; }