AtCoder Beginner Contest 203の振り返り

AtCoder Beginner Contest 203(ABC203)に参加した。

https://atcoder.jp/contests/abc203

今回はその振り返りをしたいと思う。実際のコンテストで解けた問題はC問題までだった。次はDを目指したい。

A – Chinchirorin サイコロ問題

https://atcoder.jp/contests/abc203/tasks/abc203_a

考察

  • サイコロa,bを評価
  • サイコロb,cを評価
  • サイコロc,aを評価
  • それぞれ上から条件式を立てて同じものがあれば、それ以外のサイコロの目を出力の時に間違えて2回出力しないために、else (elif) 文を使う等する必要がある。

コード

let (a,b,c) = read3Ints()
 var ans = 0
 if a == b {
  ans = c
 } else if a == c {
     ans = b
 } else if b == c {
     ans = a
 }
 print(ans)

B – AtCoder Condominium 縦と横の順番

考察

  • 全探索問題
  • 縦と横移動で計算
  • N階立てのマンション
  • K部屋のマンション
  • 全ての部屋番号を足したものを出力

コード

let (N, K) = readTwoInts()
var sum = 0
for i in 1...N {
    for j in 1...K {
        sum += i * 100 + j
    }
}
print(sum)

C – Friends and Travel costs

考察

  • Nの大きさからしてfor文は1回
\[ 1<= N <= 2 × 10^5\]
\[ 2 × 10^5 log(2 × 10^5) = 2 × 5 × 10^5\]

コード

func main1() {
    let ints = readLine()!.split(separator: " ").map { Int($0)! }
    let N = ints[0]
    let K = ints[1]

    let frends = (0..<N).map { _ in readLine()!.split(separator: " ").map { Int($0)!} }.sorted { $0[0] < $1[0] }

    var myM = K
    var myP = 0
    var distance = 0
    for i in 0..<N {
        if frends[i][0] != myP {
        distance = frends[i][0] - myP
        }
        let fM = frends[i][1]
        let fP = frends[i][0]
        if myP == fP {
            myM += fM
        } else if myM >= distance {
            myM += fM
            myM -= fP
            myP += fP
        } else {
            myP += myM
            print(myP)
            return
        }
    }

    print(myP+myM)
    return
}

main1()

distanceを求める関数はよく使うと思うので関数化した方が良いかも。

D問題はまたいつかチャレンジしたい。

https://scrapbox.io/appgrapepublic/D_-_Pond

コメントを残す

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