第5回目のコンテストの参加。今回はC問題まで解けた。
A – Repression
本番ではsortして1番目2番目を足すという手法を用いた。
max関数を使えばよりスッキリする。
//A
let (A,B,C) = read3Ints()
print(max(A+B,A+C,B+C))
B – Hydrate
青ボールと赤ボールの問題。一番初めの場合分けに注意
割り算は掛け算に直すとそのままInt型で計算できる。
func read4Ints() -> (a: Int, b: Int, c: Int, d: Int) {
let ints = readLine()!.split(separator: " ").map { Int($0)! }
return (a: ints[0], b: ints[1], c: ints[2], d: ints[3])
}
func main1() {
let (A,B,R,D) = read4Ints()
var blue = A
var red = 0
var count = 0
//0回目
if B >= D * R {
print(-1)
} else {
for _ in 0..<100_000 {
blue += B
red += R
count += 1
if blue <= D * red {
print(count)
return
}
}
}
}
main1()
C – Many Segments
閉区間と開区間の問題で区間に少しでも被りがあれば、カウントを増やす。
条件の扱いに注意が必要になってくる。
- sort
- 条件について初めにカウントしない場合を考えるとうまくいく。
func readInt() -> Int {
return Int(readLine()!)!
}
func readInts() -> [Int] {
return readLine()!.split(separator: " ").map { Int($0)! }
}
//C
let N = readInt()
var arr = (0..<N).map {_ in readInts()}
var ans = 0
arr.sort{ $0[1] < $1[1] }
for i in 0..<N {
for j in i+1..<N {
if arr[i][2] == arr[j][1] {
//カウントしない場合を考える
if arr[i][0]%2 == 0 || arr[j][0] > 2 {
} else {
ans += 1
}
} else if arr[i][2] > arr[j][1] {
ans += 1
} else { break }
}
}
print(ans)
まとめ
今回のC問題は問題に対してのひらめきが必要になる問題だった。
アルゴリズム力と同時にひらめき力も必要になってくると感じた。
C以降の問題にもチャレンジしていきたいと思う。
https://scrapbox.io/appgrapepublic/AtCoder_Beginner_Contest_207