AtCoder Beginner Contest 207 振り返り

第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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です