結果
問題 | No.3 ビットすごろく |
ユーザー | tnoda_ |
提出日時 | 2015-02-04 20:04:21 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 993 bytes |
コンパイル時間 | 14,564 ms |
コンパイル使用メモリ | 226,512 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-01 07:12:13 |
合計ジャッジ時間 | 15,653 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 33 |
ソースコード
package main import "fmt" type intQueue []int func newIntQueue(size int) *intQueue { q := make(intQueue, 0, size) return &q } func (q *intQueue) Len() int { return len(*q) } func (q *intQueue) Empty() bool { return q.Len() == 0 } func (q *intQueue) Push(x int) { *q = append(*q, x) } func (q *intQueue) Peek() int { return (*q)[0] } func (q *intQueue) Pop() int { z := (*q)[0] *q = (*q)[1:] return z } func d(x int) (z int) { for x > 0 { z += x & 1 x >>= 1 } return } func min(x, y int) int { if y < x { return y } return x } func main() { Inf := 1 << 28 var N int fmt.Scan(&N) dp := make([]int, N+1) for i := 0; i <= N; i++ { dp[i] = Inf } dp[1] = 1 q := newIntQueue(N) q.Push(1) for !q.Empty() { x := q.Pop() dx := d(x) if x-dx > 1 && dp[x-dx] == Inf { dp[x-dx] = dp[x] + 1 q.Push(x - dx) } if x+dx <= N && dp[x+dx] == Inf { dp[x+dx] = dp[x] + 1 q.Push(x + dx) } } if dp[N] == Inf { dp[N] = -1 } fmt.Println(dp[N]) }