結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-03-02 12:21:01 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,554 bytes |
| コンパイル時間 | 583 ms |
| コンパイル使用メモリ | 103,868 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-12 07:09:27 |
| 合計ジャッジ時間 | 1,505 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
import std.stdio;
import std.string, std.conv, std.array, std.algorithm;
import std.uni, std.math;
import core.bitop;
void main(){
auto N = readln.chomp.to!int;
auto ans = bfs(N);
ans.writeln;
}
auto bfs(int N){
auto checked = new bool[](N + 1);
auto d = new int[](N + 1);
auto nxts = new Queue!(int)(N + 1);
d[0] = 0, d[1] = 1;
checked[0] = true, checked[1] = true;
nxts.push(1);
while(!nxts.isEmpty){
auto u = nxts.pop();
if(u == N) return d[u];
int st = popcnt(u);
if(u + st <= N && !checked[u + st]){
d[u + st] = d[u] + 1;
nxts.push(u + st);
checked[u + st] = true;
}
if(u - st >= 0 && !checked[u - st]){
d[u - st] = d[u] + 1;
nxts.push(u - st);
checked[u - st] = true;
}
}
return -1;
}
class Queue(T){
private T[] queue;
private int head, tail, size;
this(int N){
queue = new T[](N);
head = 0, tail = 0;
size = N;
}
bool isEmpty(){
return head == tail;
}
bool isFull(){
return head == (tail + 1) % size;
}
void push(T stuff){
if(this.isFull) throw new Exception("Stack is Full.");
queue[tail] = stuff;
tail = (tail + 1) % size;
}
auto pop(){
if(this.isEmpty) throw new Exception("Stack is Empty.");
auto res = queue[head];
head = (head + 1) % size;
return res;
}
auto top(){
return queue[head];
}
}