• 统计射击比赛成绩(JavaScript)


    目录

    题目描述

    条件如下

    输入描述

    输出描述

    用例

    算法源码


    题目描述

    给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高3个分数之和进行降序排名,输出降序排名后的选手ID序列。

    条件如下

    1. 一个选手可以有多个射击成绩的分数,且次序不固定。
    2. 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手。
    3. 如果选手的成绩之和相等,则成绩之和相等的选手按照其ID降序排列。


    输入描述

    • 输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数(2<=N<=100)。
    • 输入第二行,一个长度为N整数序列,表示参与每次射击的选手ID(0<=ID<=99)。
    • 输入第三行,一个长度为N整数序列,表示参与每次射击的选手对应的成绩(0<=成绩<=100)。

    输出描述

    符合题设条件的降序排名后的选手ID序列。

    用例

    输入

    13
    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,最高3个成绩的和为:80+55+53=188。
    • 4号选手成绩:24,39,76,66,最高3个成绩的和为:76+66+39=181。
    • 5号选手成绩:53,80,55,最高3个成绩的和为:80+55+53=188。
    • 7号选手成绩:68,16,100,最高3个成绩的和为:100+68+16=184。

    比较各个选手最高3个成绩的和,有3号=5号>7号>4号,由于3号和5号成绩相等且ID号5>3, 所以输出为:5,3,7,4

    算法源码

    1. /* JavaScript Node ACM模式 控制台输入获取 */
    2. const readline = require("readline");
    3. const rl = readline.createInterface({
    4. input: process.stdin,
    5. output: process.stdout,
    6. });
    7. const lines = [];
    8. rl.on("line", (line) => {
    9. lines.push(line);
    10. if (lines.length === 3) {
    11. sort(lines);
    12. lines.length = 0;
    13. }
    14. });
    15. /* 射击成绩排序-基于对象 */
    16. function sort(lines) {
    17. // 第一行输入:射击次数,13
    18. const count = parseInt(lines[0]);
    19. // 第二行输入:选手id,3,3,7,4,4,4,4,7,7,3,5,5,5
    20. const ids = lines[1].split(",");
    21. // 第三行输入:选手分数,53,80,68,24,39,76,66,16,100,55,53,80,55
    22. const scores = lines[2].split(",");
    23. // 将score归类到对应id中
    24. const obj = {};
    25. for (let i = 0; i < count; i++) {
    26. let key = ids[i];
    27. let val = scores[i];
    28. if (!obj[key]) {
    29. obj[key] = [];
    30. }
    31. obj[key].push(val);
    32. }
    33. /*
    34. {
    35. '3': [ '53', '80', '55' ],
    36. '4': [ '24', '39', '76', '66' ],
    37. '5': [ '53', '80', '55' ],
    38. '7': [ '68', '16', '100' ]
    39. }
    40. */
    41. const sorts = [];
    42. for (const key in obj) {
    43. // 忽略成绩少于3个的选手
    44. if (obj[key].length < 3) {
    45. delete obj[key];
    46. }
    47. // 只保留最高的三次成绩
    48. obj[key].sort((a, b) => {
    49. return b - a;
    50. });
    51. obj[key].length = 3;
    52. /*
    53. {
    54. '3': [ '53', '80', '55' ],
    55. '4': [ '39', '76', '66' ],
    56. '5': [ '53', '80', '55' ],
    57. '7': [ '68', '16', '100' ]
    58. }
    59. */
    60. // 对最高的三次成绩求和
    61. obj[key] = obj[key].reduce((pre, cur) => {
    62. return parseInt(pre) + parseInt(cur);
    63. });
    64. /*
    65. {
    66. '3': 188,
    67. '4': 181,
    68. '5': 188,
    69. '7': 184
    70. }
    71. */
    72. // 由于对象属性无法进行条件排序,所以我们需要将id:score存到数组中
    73. sorts.push({ id: key, score: obj[key] });
    74. /*
    75. [{id:'3', score:188}, {id:'4', score:181}, {id:'5', score:188}, {id:'7', score:184 }]
    76. */
    77. }
    78. console.log(
    79. sorts
    80. .sort((s1, s2) => {
    81. return s2.score - s1.score
    82. ? s2.score - s1.score
    83. : s2.id - s1.id
    84. ? s2.id - s1.id
    85. : 0;
    86. })
    87. .map((item) => item.id)
    88. .join(",")
    89. );
    90. }
  • 相关阅读:
    【蓝桥杯冲击国赛计划第7天】模拟和打表 {题目:算式问题、求值、既约分数、天干地支}
    SkyWalking环境搭建与使用
    【三次握手、四次挥手】TCP建立连接和断开连接的过程、为什么需要三次握手,为什么需要四次挥手、TCP的可靠传输如何保证、为什么需要等待2MSL等重点知识汇总
    Redis基础命令(set类型)交集并集差集
    体验一下 Claude 3.5 Sonnet
    win10无hyper-v设置
    【Unity】找到目标的三种方式(范围内检测敌人)
    leetcode2022年度刷题分类型总结(十二)并查集
    supervisor守护python进程报FATAL错 spawn error
    Java核心知识体系:AOP原理和切面应用
  • 原文地址:https://blog.csdn.net/qfc_128220/article/details/126005902