結果
問題 | No.3 ビットすごろく |
ユーザー | nanae |
提出日時 | 2017-06-16 18:44:06 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,826 bytes |
コンパイル時間 | 691 ms |
コンパイル使用メモリ | 103,160 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-12 20:12:01 |
合計ジャッジ時間 | 1,891 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 1 ms
6,944 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 1 ms
6,944 KB |
testcase_07 | AC | 1 ms
6,940 KB |
testcase_08 | AC | 1 ms
6,944 KB |
testcase_09 | AC | 1 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 1 ms
6,944 KB |
testcase_12 | AC | 1 ms
6,940 KB |
testcase_13 | AC | 1 ms
6,940 KB |
testcase_14 | AC | 1 ms
6,944 KB |
testcase_15 | AC | 1 ms
6,940 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 1 ms
6,940 KB |
testcase_18 | AC | 1 ms
6,940 KB |
testcase_19 | AC | 1 ms
6,940 KB |
testcase_20 | AC | 1 ms
6,944 KB |
testcase_21 | AC | 1 ms
6,944 KB |
testcase_22 | AC | 2 ms
6,940 KB |
testcase_23 | AC | 2 ms
6,940 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | AC | 2 ms
6,944 KB |
testcase_26 | AC | 1 ms
6,940 KB |
testcase_27 | AC | 1 ms
6,940 KB |
testcase_28 | AC | 2 ms
6,940 KB |
testcase_29 | AC | 1 ms
6,944 KB |
testcase_30 | AC | 1 ms
6,940 KB |
testcase_31 | AC | 1 ms
6,944 KB |
testcase_32 | AC | 1 ms
6,940 KB |
ソースコード
import std.stdio, std.string, std.conv, std.algorithm; import std.range, std.array, std.container, std.math, std.typecons; immutable int mod = 10^^9 + 7; immutable int inf = 20000; int N; void main() { N = readln.chomp.to!int; auto d = new int[](N); auto q = Queue!(int)(N + 10); fill(d, inf); d[0] = 1; q.push(0); int pos; while (!q.empty) { pos = q.front; q.pop; if (pos == N - 1) break; int dx = popcnt(pos + 1); if (pos + dx < N && d[pos + dx] == inf) { d[pos + dx] = d[pos] + 1; q.push(pos + dx); } if (pos - dx >= 0 && d[pos - dx] == inf) { d[pos - dx] = d[pos] + 1; q.push(pos - dx); } } debug { stderr.writeln(d); } writeln(d[N - 1] < inf ? d[N - 1] : -1); } int popcnt(int x) { return x > 0 ? popcnt(x>>1) + (x & 1) : 0; } unittest { assert(popcnt(0) == 0); assert(popcnt(3) == 2); assert(popcnt(15) == 4); assert(popcnt(24) == 2); assert(popcnt(7) == 3); assert(popcnt(8) == 1); } struct Queue(T) { private: int N, head, tail; T[] data; public: this(int size) { N = size + 1; data = new T[](N); } bool empty() @property { return head == tail; } bool full() @property { return (tail + 1) % N == head; } void push(T x) @property { assert(!full); data[tail++] = x; tail %= N; } void pop() @property { assert(!empty); (head += 1) %= N; } T front() @property { assert(!empty); return data[head]; } void clear() @property { head = tail = 0; } int length() @property { return (tail - head + N) % N; } }