結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-03-07 22:08:44 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,061 bytes |
| コンパイル時間 | 566 ms |
| コンパイル使用メモリ | 68,480 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-01 07:18:03 |
| 合計ジャッジ時間 | 1,550 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int N;
bool input(istream& in)
{
if (!(in >> N)) return false;
return true;
}
int bit_count(int num)
{
num = (num & 0x55555555) + ((num & 0xAAAAAAAA) >> 1);
num = (num & 0x33333333) + ((num & 0xCCCCCCCC) >> 2);
num = (num & 0x0F0F0F0F) + ((num & 0xF0F0F0F0) >> 4);
num = (num & 0x00FF00FF) + ((num & 0xFF00FF00) >> 8);
num = (num & 0x0000FFFF) + ((num & 0xFFFF0000) >> 16);
return num;
}
int resolve()
{
vector<int> visit(N + 1);
set<int> positions;
positions.insert(1);
for (int step = 1; step <= N; step++) {
set<int> next;
for (int pos : positions) {
if (visit[pos] == 0) {
if (pos == N) return step;
visit[pos] = step;
int distance = bit_count(pos);
if (1 <= pos - distance) {
next.insert(pos - distance);
}
if (pos + distance <= N) {
next.insert(pos + distance);
}
}
}
positions.swap(next);
}
return -1;
}
int main(int argc, char **argv)
{
while (input(cin)) {
cout << resolve() << endl;
}
return 0;
}