結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
airuai
|
| 提出日時 | 2016-09-14 14:22:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3,306 ms / 5,000 ms |
| コード長 | 1,008 bytes |
| コンパイル時間 | 549 ms |
| コンパイル使用メモリ | 64,132 KB |
| 実行使用メモリ | 37,816 KB |
| 最終ジャッジ日時 | 2024-07-01 08:06:35 |
| 合計ジャッジ時間 | 27,593 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
#include <iostream>
#include <queue>
using namespace std;
int BinaryCount(int a) {
/*int count = 0;
while (n > 0) {
count += n % 2;
n /= 2;
}
return count;*/
int cnt = 0;
while (a>0) {
cnt++;
a &= a - 1;
}
return cnt;
}
class Data {
public:
int p, kind;
Data(){}
Data(int p, int kind) {
this->p = p;
this->kind = kind;
}
void set(int a, int b) {
p = a;
kind = b;
}
};
int main(void) {
int n;
cin >> n;
bool* flag = new bool[n];
for (int i = 0; i < n; ++i) {
flag[i] = false;
}
int hosuu;
queue<Data> q;
Data d(1, 1);
Data out;
q.push(d);
do {
d = q.front(); q.pop();
if (d.p == n) {
cout << d.kind << endl;
return 0;
}
flag[d.p - 1] = true;
hosuu = BinaryCount(d.p);
if (d.p - hosuu > 0 && !flag[d.p - 1 - hosuu]) {
out.set(d.p - hosuu, d.kind + 1);
q.push(out);
}
if (d.p + hosuu <= n && !flag[d.p - 1 + hosuu]) {
out.set(d.p + hosuu, d.kind + 1);
q.push(out);
}
} while (!q.empty());
cout << "-1" << endl;
return 0;
}
airuai