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\]
- Kの大きさはO(1)の計算で行う。
- ソートの計算量 https://rusutikaa.github.io/docs/developer.apple.com/documentation/swift/array/2296801-sort.html
- 計算量:O(nlog n)、ここでnはコレクションの長さ
\[ 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問題はまたいつかチャレンジしたい。