結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
kaito_tateyama
|
| 提出日時 | 2017-08-17 05:51:57 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,118 bytes |
| コンパイル時間 | 1,590 ms |
| コンパイル使用メモリ | 172,928 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-01 08:47:42 |
| 合計ジャッジ時間 | 2,597 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
#include <bits/stdc++.h>
//---------------------------
using namespace std;
//---------------------------
#define REP(i,n) for(int i = 0; i < (n); i++)
#define P(x) cout << (x) << "\n"
#define MOD 1e9+7
#define PI acos(-1.0)
//---------------------------
const int INF = numeric_limits<int>::max();
//2進法桁和を返す
int f(int N) {
int cnt = 0;
while (N>0) {
if(N % 2 == 1) cnt++;
N = N / 2;
}
return cnt;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n;cin >>n;
queue<int> q;//指標:調べるマス番号を入れる
q.push(1);
vector<int> v(n+1,INF);//vに最短距離投げ込む
v[1] = 1;
while (!q.empty()) {
int mas = q.front();
q.pop();
int bitsum = f(mas);
if (mas - bitsum > 0 && v[mas - bitsum] == INF) {
//vに書き込み
v[mas - bitsum] = v[mas] + 1;
q.emplace(mas - bitsum);//qに現在地入れる
}
if (mas + bitsum < n+1 && v[mas + bitsum] == INF) {
v[mas + bitsum] = v[mas] + 1;
q.emplace(mas + bitsum);
}
}
cout << (v[n] == INF ? -1 : v[n]) << "\n";
return 0;
}
kaito_tateyama