結果
| 問題 |
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])
}
tnoda_