🌈 Scala 实现
题目描述:
- 给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高三个分数之和进行降序排名,输出降序排名后的选手id序列。
题目解析:
- 给一个数字表示射击的次数,然后给几个选手进行(乱序)射击,生成对应的成绩!
条件如下:
- 一个选手可以有多个射击成绩的分数,且次序不固定
- 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
- 如果选手的成绩之和相等,则相等的选手按照其id降序排列
输入描述:
- 输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数(2<=N<=100)
- 输入第二行,一个长度为N整数序列,表示参与每次射击的选手id(0<=id<=99)
- 输入第三行,一个长度为N整数序列,表示参与每次射击选手对应的成绩(0<=成绩<=100)
输出描述:
- 符合题设条件的降序排名后的选手ID序列
示例
输入:
- 31
- 3,3,7,4,4,4,4,7,7,3,5,5,5
- 53,80,68,24,39,76,66,16,100,55,53,80,55
输出:
- 5,3,7,4
说明:
- 该场射击比赛进行了13次,参赛的选手为{3,4,5,7}
- 3号选手成绩53,80,55 最高三个成绩的和为188
- 4号选手成绩24,39,76,66 最高三个成绩的和为205
- 5号选手成绩53,80,55 最高三个成绩的和为188
- 7号选手成绩68,16,100 最高三个成绩的和为184
- 比较各个选手最高3个成绩的和,有4号>3号=5号>7号,由于3号和5号成绩相等,且id 5>3,所以输出 7,5,3,4
代码:
def main(args: Array[String]): Unit = {
val scan = new Scanner(System.in)
// 总设计次数
var count = scan.nextLine().toInt
// 射击者ID
var ids = scan.nextLine().split(",").map(_.toInt)
// 射击者分数
var scores = scan.nextLine().split(",").map(_.toInt)
// 用于存放射击者、对应成绩
val container = new mutable.HashMap[Int, ListBuffer[Int]]()
// 将同一个人的成绩放入容器中
for (index <- 1 to count) {
// 先将射击者放进去
container.getOrElseUpdate(ids(index - 1), ListBuffer())
// 再将射击者的成绩依次追加进去
container.apply(ids(index - 1)).+=(scores(index - 1))
}
// 用于存放输出结果
val builder = new StringBuilder
container
.filter(_._2.size > 2) // 如果成绩个数少于三3个就不要
.mapValues(_.sum) // 对射击者的成绩求和
.toList // 转型为 List
.sortWith((o1, o2) => {
if (!o1._2.equals(o2._1)) {
o1._2.compareTo(o2._2) < 0 // 先按照分数升序排列
} else {
o1._1.compareTo(o2._1) < 0 // 相同分数的再按照id降序排列
}
})
.foreach(num => {
builder.append(num._1).append(",") // 将射击者追加到 builder 中
})
print(builder.substring(0, builder.size - 1)) // 输出结果
}
❤️ END ❤️