Closed3
11/25(土)のトヨタシステムズプログラミングコンテスト2023(AtCoder Beginner Contest 330)のC問題で全探索も範囲を絞るっていうテクニックを学んだのでメモ
ACになった回答はこれ。
最初にxの最大値になる値を計算する。
そこから、xを最大値まで増やしつつ、yの-1 ~1の範囲内でチェックしていき、最終的にx*x + yy*yy - D
が最も小さくなる値を取得する。
ChatGPTに聞きながら答えを作成した。
package main
import (
"fmt"
"math"
)
func main() {
var D int64
fmt.Scan(&D)
minValue := D // 最小値の初期値はDとする(最大でもD)
// xの上限を計算。 xは非負整数なので、int64()でキャストする
limitX := int64(math.Sqrt(float64(D)))
for x := int64(0); x <= limitX; x++ {
// yは非負整数なので、int64()でキャストする
y := int64(math.Sqrt(float64(D - x*x)))
for dy := -1; dy <= 1; dy++ {
// yの近傍も探索
yy := y + int64(dy)
value := x*x + yy*yy - D
if value < 0 {
value = -value
}
if value < minValue {
minValue = value
}
}
}
fmt.Println(minValue)
}
このスクラップは2023/11/28にクローズされました