白駿1132号:合-Swift


https://www.acmicpc.net/problem/1132
難易度-金貨3🥇
アルゴリズム分類:グリディ
🧐 質問へのアクセス
これはGold 3なので、何の落とし穴なのかわかりませんが、データ量が多いので、時間が迫っていると思います.
でもそんなことはなくただ思うままに解決すればいい!
2
ABC
BCA
入力時、
Aは100+1
Bは10+100
Cは1+10
そうですね.では11010111順に9,8,7を順番に乗せればいいのです簡単すぎるでしょう?
注意点の一番前にあるアルファベットには0を割り当てることはできません.単独で処理すればいい!
コード#コード#
1.アルファベットの桁数を求める
dictを使用して管理します.
0を処理するために、一番前のアルファベットをfrontalphaに入れます.
後で9876543210が全部切れたら、
frontalphaにないアルファベット表では、最小値のアルファベット表に0を指定します.
var dict: [Character: Double] = [:]
var frontAlpha: Set<Character> = []

for _ in 0..<n {
    let numbers = Array(readLine()!)
    frontAlpha.insert(numbers.first!)
    
    for (idx,ch) in numbers.reversed().enumerated() {
        if dict[ch] != nil {
            dict[ch]! += pow(10, Double(idx))
        } else {
            dict[ch] = pow(10, Double(idx))
        }
    }
}
処理2.0
//0처리 하기
if dict.count == 10 {
    for (key,_) in dict.sorted(by: {$0.value < $1.value}) where !frontAlpha.contains(key) {
        dict[key] = nil
        break
    }
}
完全なコード
//1132번 합
import Foundation

let n = Int(readLine()!)!

var dict: [Character: Double] = [:]
var frontAlpha: Set<Character> = []

for _ in 0..<n {
    let numbers = Array(readLine()!)
    frontAlpha.insert(numbers.first!)
    
    for (idx,ch) in numbers.reversed().enumerated() {
        if dict[ch] != nil {
            dict[ch]! += pow(10, Double(idx))
        } else {
            dict[ch] = pow(10, Double(idx))
        }
    }
}

//0처리 하기
if dict.count == 10 {
    for (key,_) in dict.sorted(by: {$0.value < $1.value}) where !frontAlpha.contains(key) {
        dict[key] = nil
        break
    }
}

var ans = 0
var num = 9
for value in dict.values.sorted(by: >) {
    ans += Int(value) * num
    num -= 1
}

print(ans)
一行評価:1銀色レベルのようです.