(B卷,100分)- 比赛(Java & JS & Python)

题目描述

  • 一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。
  • 打分规则为每个评委对选手打分,最高分10分,最低分1分。
  • 请计算得分最多的3位选手的编号。
  • 如果得分相同,则得分高分值最多的选手排名靠前
  • (10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。

输入描述

  • 第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。
  • 第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。

输出描述

  • 选手前3名的编号。
  • 注:若输入为异常,输出-1,如M、N、打分不在范围内。

用例

输入 4,5
10,6,9,7,6
9,10,6,7,5
8,10,6,5,10
9,10,8,4,9
输出 2,1,5
说明

第一行代表有4个评委,5个选手参加比赛

矩阵代表是4*5,每个数字是选手的编号,每一行代表一个评委对选手的打分排序,

2号选手得分36分排第1,1号选手36分排第2,5号选手30分(2号10分值有3个,1号10分值只有1个,所以2号排第一)

输入 2,5
7,3,5,4,2
8,5,4,4,3
输出 -1
说明 只有2个评委,要求最少为3个评委
输入 4,2
8,5
5,6
10,4
8,9
输出 -1
说明 只有2名选手参加,要求最少为3名
输入 4,5
11,6,9,7,8
9,10,6,7,8
8,10,6,9,7
9,10,8,6,7
输出 -1
说明 第一个评委给第一个选手打分11,无效分数

题目解析

考察数组排序,主要难点在于下面逻辑的设计

如果得分相同,则得分高分值最多的选手排名靠前

我这里直接将选手分数降序排序后,join('')为字符串数值,高分多的选手该字符串数值越大

JavaScript算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let m, n;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [m, n] = lines[0].split(",").map(Number);
  }

  if (m && lines.length === m + 1) {
    lines.shift();
    const scores = lines.map((line) => line.split(",").map(Number));
    console.log(getResult(scores, m, n));
    lines.length = 0;
  }
});

function getResult(scores, m, n) {
  if (m < 3 || m > 10 || n < 3 || n > 100) return -1;

  const players = [];

  for (let j = 0; j < n; j++) {
    const player = [];
    for (let i = 0; i < m; i++) {
      if (scores[i][j] > 10 || scores[i][j] < 1) return "-1";
      player.push(scores[i][j]);
    }
    player.sort((a, b) => b - a);
    players.push({
      idx: j,
      sum: player.reduce((p, c) => p + c),
      score: player,
    });
  }

  return players
    .sort((a, b) => {
      if (a.sum != b.sum) return b.sum - a.sum;

      for (let i = 0; i < m; i++) {
        if (a.score[i] == b.score[i]) continue;
        return b.score[i] - a.score[i];
      }

      return 0;
    })
    .slice(0, 3)
    .map((a) => a.idx + 1)
    .join(",");
}

Java算法源码

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
import java.util.StringJoiner;

public class Main {
  // 输入获取
  public static void main(String[] args) {
    // 将输入分隔符设置为“,”或者换行
    Scanner sc = new Scanner(System.in).useDelimiter("[,n]");

    int m = sc.nextInt();
    int n = sc.nextInt();

    int[][] scores = new int[m][n];
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        scores[i][j] = sc.nextInt();
      }
    }

    System.out.println(getResult(m, n, scores));
  }

  // 算法入口
  public static String getResult(int m, int n, int[][] scores) {
    if (m < 3 || m > 10 || n < 3 || n > 100) return "-1";

    HashMap<Integer, Integer[]> players = new HashMap<>();

    for (int j = 0; j < n; j++) { // 列
      Integer[] player = new Integer[m];
      for (int i = 0; i < m; i++) { // 行
        if (scores[i][j] > 10 || scores[i][j] < 1) return "-1"; // 队员得分1~10合法,否则不合法
        player[i] = scores[i][j];
      }
      Arrays.sort(player, (a, b) -> b - a); // 将每个队员的得分降序
      players.put(j, player);
    }

    StringJoiner sj = new StringJoiner(",");

    players.entrySet().stream()
        .sorted(
            (a, b) -> {
              Integer[] playerA = a.getValue();
              Integer[] playerB = b.getValue();

              int sumA = sum(playerA);
              int sumB = sum(playerB);

              if (sumA != sumB) { // 按总分降序
                return sumB - sumA;
              }

              for (int i = 0; i < m; i++) {
                if (playerA[i] == playerB[i]) continue;
                return playerB[i] - playerA[i]; // 按最高分降序
              }

              return 0;
            })
        .limit(3)
        .forEach(p -> sj.add(p.getKey() + 1 + ""));

    return sj.toString();
  }

  public static int sum(Integer[] arr) {
    return Arrays.stream(arr).reduce(Integer::sum).orElse(0);
  }
}

Python算法源码

# 输入获取
import functools

m, n = map(int, input().split(","))
scores = [list(map(int, input().split(","))) for _ in range(m)]


def cmp(a, b):
    if a["sum"] != b["sum"]:
        return b["sum"] - a["sum"]

    for i in range(m):
        if a["score"][i] == b["score"][i]:
            continue
        return b["score"][i] - a["score"][i]

    return 0


# 算法入口
def getResult():
    if m < 3 or m > 10 or n < 3 or n > 100:
        return "-1"

    players = []

    for j in range(n):
        player = []
        for i in range(m):
            if scores[i][j] > 10 or scores[i][j] < 1:
                return "-1"
            player.append(scores[i][j])

        player.sort(reverse=True)
        players.append({
            "idx": j,
            "sum": sum(player),
            "score": player
        })

    players.sort(key=functools.cmp_to_key(cmp))

    return ",".join(list(map(lambda x: str(x["idx"] + 1), players[:3])))


# 算法调用
print(getResult())

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?