Closed3

11/25(土)のトヨタシステムズプログラミングコンテスト2023(AtCoder Beginner Contest 330)のC問題で全探索も範囲を絞るっていうテクニックを学んだのでメモ

yuto-myuto-m

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にクローズされました