LoginSignup
0
0

More than 1 year has passed since last update.

【競プロ/Swift】まよコン 2023/03/17

Posted at

注意事項

本記事は復習のための日記的なものであり、丁寧な解説を求めている方には不十分かと思われますので、ご了承のほどお願いいたします。

正解済み問題

B - A Reverse

問題文
こちら問題ページ

解答
入力値の決められた区間を反転さして出力。

import Foundation
let lr = readLine()!.split(separator: " ").map{Int($0)! - 1}
let s = Array(readLine()!)

var front = ""
var center = ""
var back = ""

for index in 0..<s.count {
    if index >= lr[0] && index <= lr[1] {
        center += String(s[index])
    } else if index < lr[0] {
        front += String(s[index])
    } else {
        back += String(s[index])
    }
}
center = String(center.reversed())
print(front + center + back)

誤答及び、未解答問題

C - Ameba

問題文
こちら問題ページ

正答
解き方というか、問題の意味がわからなくて諦めた。
解説や他の人の解答を見て、ギリ分かったような分からないようなふわふわした感じなので、とりあえず正解の解答だけ残しておく。

func ABC274C() {
    func readInt() -> Int {
        return Int(readLine()!)!
    }
    
    func readIntItems() -> [Int] {
        let strings = readLine()!.split(separator: " ")
        return strings.map { Int($0)! }
    }
    let N = readInt()
    let A = readIntItems()

    // 何世代前からの配列を作る。(これが最終的に出力する答え)
    var countArray = [Int](repeating: 0, count: 2*N+1)
    for i in 0..<N {
        //アメーバの数をcountArrayのindexとして使いたいため、-1している。(アメーバの最小値は1のため)
        let a = A[i]-1
        countArray[(i+1)*2-1] += countArray[a] + 1
        countArray[(i+1)*2] += countArray[a] + 1
    }
    for a in countArray {
        print(a)
    }

}
ABC274C()

C - Martial artist

問題文
こちら問題ページ

誤答1
N個目の技を習得するために必要な技のコストだけ計算しており、WAで終了。

let n = Int(readLine()!)!
var skills: [[Int]] = []

for _ in 0..<n {
    let tka = readLine()!.split(separator: " ").map{Int($0)!}
    skills.append(tka)
}

let nK = skills[n-1][1]

var needSlills: [Int] = Array(skills[n-1][2...(1 + nK)])
var score: Int64 = Int64(skills[n-1][0])
for index in needSlills {
    score += Int64(skills[index-1][0])
}
print(score)

誤答2
N個目の技を覚えるために求められる技を覚えるために求められる技を計算しようと、重複しないSet配列でループを回したが、何かが間違っていたのかWAで終了。
せめてTLEになって欲しかった。。

let n = Int(readLine()!)!
var skills: [[Int]] = []

for _ in 0..<n {
    let tka = readLine()!.split(separator: " ").map{Int($0)!}
    skills.append(tka)
}

let nK = skills[n-1][1]

var needSlills: Set<Int> = Set(skills[n-1][2...(1 + nK)])
for index in needSlills {
    let k = skills[index][1]
    for num in skills[index][2...(1+k)] {
        needSlills.insert(num)
    }
}


var score: Int64 = Int64(skills[n-1][0])
for index in needSlills {
    score += Int64(skills[index-1][0])
}
print(score)

正答
答えは案外理解しやすいコードでかける。
集計しないといけない技のマーキングリストを作って、それに対して集計したいindexの値をtrueに変えていく。
集計の肝なのは1周目にN個目の技の必要技indexから回している点、あとは1周目でマークした値を順に見ていき、必要であれば必要技indexをtrueにしていけば漏れなく集計できる。
最後にマーキングしたindexの習得時間を集計すれば、正解できる。

let N = Int(readLine()!)!
var waza: [[Int]] = .init(repeating: [], count: N+1)
let TKA = (0..<N).map{_ in readLine()!.split(separator:" ").map{Int(String($0))!}}

var marks: [Bool] = .init(repeating: false, count: N+1)
marks[N] = true

for ii in 0..<N {
    let i = N-ii
    if !marks[i] { continue }
    for req in TKA[i-1][2...] {
        marks[req] = true
    }
}

print((0..<N).filter{ marks[$0+1] }.reduce(0) { $0 + TKA[$1][0] })

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0