ABC023 D問題 射撃王
https://atcoder.jp/contests/abc023/tasks/abc023_d
https://scrapbox.io/files/6117a9329a864c001da93197.png
二分探索の問題(~を満たす最大 (最小) の値を求めよ系の問題)
解 x を仮定して可能かを判定する問題に置き換えて
解 x が可能となるような最大 (最小) の x を求める
最も高い場所で割られた風船が得点となる
→高度 x 以下で全ての風船が割れるかどうかの判定問題に持ち込む
制限があれば、風船を割る優先順位が決まる!
https://drken1215.hatenablog.com/entry/2021/06/12/113100
これに内容が詳しく載ってます!
https://scrapbox.io/files/6117acf488dd7e001d41373b.jpg
だいたいこうだろうコード *WAあり
code:swift
let N = Int(readLine()!)!
var H = Int.init()
var S = Int.init()
for _ in 0..<N{
let input = readLine()!.split(separator: " ").map{Int($0)!}
H.append(input0)
S.append(input1)
}
var left = -1
var right = Int.max //Intの最高数にしたら正解した。。
while(right - left > 1){
let mid = left + (right - left) / 2
var T = Int.init(repeating: 0, count: N)
var ok = true
for i in 0..<N{
if mid < Hi{
ok = false
}else{
Ti = (mid - Hi)/Si //Tiは指定の高度に達する時間 つまり この時間が早いほど優先度が高い
}
}
T = T.sorted() //タイムリミットが早い順にソート
for j in 0..<N{
if (Tj < j){
ok = false
}
}
if ok{
right = mid
}else{
left = mid
}
}
print(right)