今回も前回同様C問題まで解いた.最近,論文の執筆作業に追われていて,アルゴリズムの勉強できてないから早く論文の提出を終わらせたい...
今回も解けた問題を振り返る.
A – Rolling Dice
サイコロの振る回数と出た目の合計がBになることがあるかについての問題
条件
- Bの最大値は振る回数×6
- Bの最小値は振る回数より多い
コード
func readTwoInts() -> (a: Int, b: Int) {
let ints = readLine()!.split(separator: " ").map { Int($0)! }
return (a: ints[0], b: ints[1])
}
let (A,B) = readTwoInts()
if B <= A * 6, B >= A {
print("Yes")
} else {
print("No")
}
B – Factorial Yen Coin
お釣りが出ないようにちょうどの金額を支払う
必ずお釣りが出ないという条件付きなので実装しやすかった.
func readInt() -> Int {
return Int(readLine()!)!
}
func kai(val: Int) -> Int {
var sum = 1
for i in 1 ... val {
sum *= i
}
return sum
}
func main1() {
var counts = [Int].init(repeating: 100, count: 10)
var list: [Int] = []
for i in 1...10 {
let key = kai(val: i)
list.append(key)
}
var num = 0
var P = readInt()
var cursor = 9
while P != 0 {
if list[cursor] <= P, counts[cursor] > 0 {
P -= list[cursor]
counts[cursor] -= 1
num += 1
} else {
cursor -= 1
}
}
print(num)
}
main1()
C – Fair Candy Distribution
公平にキャンディーを配るためには...
- 国民番号(マイナンバー)を割り振られており,小さい順に余ったキャンディーを配っていく.
考察
- 国民番号でソートして,余った分のキャンディーを小さい順に配る
- 元の配列の順番にソート
- 予め順番をもたせておく.タプルを使用した.
コード
let (N, K) = readTwoInts()
let As = readInts()
var list: [(a:Int,number:Int)] = []
let base = K / As.count
let mod = K % As.count
for i in 0..<N {
list.append((i,As[i]))
}
list.sort { $0.number < $1.number}
for i in 0..<mod {
list[i].number = base + 1
}
for i in mod..<list.count {
list[i].number = base
}
list.sort { $0.a < $1.a }
list.map {print($0.number)}
まとめ
継続は力なり.これからもアルゴリズムの勉強は続けていきたい.しかし,自分を追い詰め過ぎて,やる気が燃え尽きるのは自分の悪いクセ.燃え尽きるくらいならゆっくりでもいいから続けることが重要.
うまく周りの環境も使いながら勉強のモチベーションを保っていきたい.