比赛
真题目录: 点击去查看
E 卷 100分题型
题目描述
一个有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、打分不在范围内。
用例1
输入
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
输入
2,5
7,3,5,4,2
8,5,4,4,3
输出
-1
说明
只有2个评委,要求最少为3个评委。
用例3
输入
4,2
8,5
5,6
10,4
8,9
输出
-1
说明
只有两名选手参加
用例4
输入
4,5
11,6,9,7,8
9,10,6,7,8
8,10,6,9,7
9,10,8,6,7
输出
-1
说明
第一个评委给第一个选手打分11,无效分数
题解
思路:
- 接收输入时,判断数据合法性,包括(n,m,score)的值,是否符合条件
- 统计每个成员得到的总分,以及得到[1,10]各个分数的数量,用户结果排序
c++
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
using namespace std;
// 通用 split 函数
vector<string> split(const string &str, const string &delimiter) {
vector<string> result;
size_t start = 0;
size_t end = str.find(delimiter);
while (end != string::npos) {
result.push_back(str.substr(start, end - start));
start = end + delimiter.length();
end = str.find(delimiter, start);
}
// 添加最后一个部分
result.push_back(str.substr(start));
return result;
}
struct Person {
// 记录选手获得[1-10]各个分数的数量
vector<int> score;
// 统计用户的获得的总分
int sum;
// 记录选手下表
int index;
Person() : score(11, 0), sum(0), index(0) {}
};
// 按照sum进行从大到小排序,sum相等按照score从大到小排序
bool cmp(Person a, Person b) {
if (a.sum == b.sum) {
for (int i = 10; i >= 0; i--) {
if (a.score[i] != b.score[i]) {
return a.score[i] > b.score[i];
}
}
}
return a.sum > b.sum;
}
int main() {
int n, m;
string line;
getline(cin, line);
vector<string> s = split(line, ",");
n = stoi(s[1]);
m = stoi(s[0]);
// 判断数据合法性
if (n < 3 || n > 100 || m < 3 || m > 10) {
cout << -1;
return 0;
}
vector<Person> p(n, Person());
for (int i = 0; i < m; i++) {
getline(cin, line);
s = split(line, ",");
for (int j = 0; j < s.size(); j++) {
// 判断数据合法性
if (stoi(s[j]) < 1 || stoi(s[j]) > 10) {
cout << -1;
return 0;
}
// 更新选手得到的分数情况
p[j].score[stoi(s[j])] = p[j].score[stoi(s[j])] + 1;
p[j].sum += stoi(s[j]);
p[j].index = j;
}
}
// 根据自定义规则进行排序
sort(p.begin(), p.end(), cmp);
// 输出结果
for (int i = 0; i < 3; i++) {
if (i != 0) {
cout << ",";
}
cout << p[i].index + 1;
}
return 0;
}
JAVA
import java.util.*;
public class Main {
static class Person {
int[] score = new int[11]; // 分数范围是 1 到 10,所以需要 11 个位置
int sum = 0;
int index = 0;
public Person() {
Arrays.fill(score, 0);
}
}
// 按照 sum 从大到小排序;如果 sum 相等,则按 score 从大到小排序
public static int cmp(Person a, Person b) {
if (a.sum == b.sum) {
for (int i = 10; i >= 1; i--) {
if (a.score[i] != b.score[i]) {
return a.score[i] > b.score[i] ? -1 : 1;
}
}
}
return a.sum > b.sum ? -1 : 1;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
String[] s = line.split(",");
int n = Integer.parseInt(s[1]);
int m = Integer.parseInt(s[0]);
if (n < 3 || n > 100 || m < 3 || m > 10) {
System.out.println(-1);
return;
}
List<Person> persons = new ArrayList<>();
for (int i = 0; i < n; i++) {
persons.add(new Person());
}
for (int i = 0; i < m; i++) {
line = scanner.nextLine();
s = line.split(",");
for (int j = 0; j < s.length; j++) {
int score = Integer.parseInt(s[j]);
if (score < 1 || score > 10) {
System.out.println(-1);
return;
}
persons.get(j).score[score]++;
persons.get(j).sum += score;
persons.get(j).index = j;
}
}
// 排序
persons.sort((a, b) -> cmp(a, b) );
// 输出前三名的 index
for (int i = 0; i < 3; i++) {
if (i != 0) {
System.out.print(",");
}
System.out.print(persons.get(i).index + 1);
}
}
}
Python
class Person:
def __init__(self):
# 分数范围为 1 - 10 每个分数的数量
self.score = [0] * 11
# 总分
self.sum = 0
# 下标
self.index = 0
def cmp(a, b):
if a.sum == b.sum:
for i in range(10, -1, -1):
if a.score[i] != b.score[i]:
return a.score[i] > b.score[i]
return a.sum > b.sum
def main():
line = input()
s = line.split(',')
m, n = int(s[0]), int(s[1])
# 判断合法性
if not (3 <= n <= 100 and 3 <= m <= 10):
print(-1)
return
p = [Person() for _ in range(n)]
for i in range(m):
line = input()
s = line.split(',')
for j in range(len(s)):
score = int(s[j])
# 判断合法性
if not (1 <= score <= 10):
print(-1)
return
p[j].score[score] += 1
p[j].sum += score
p[j].index = j
# 先按照总分排序,总分相等按照10 -1 比较分数个数 看不懂可以参照上面cmp的的逻辑
p.sort(key=lambda person: (person.sum, person.score[::-1]), reverse=True)
# 输出结果
print(",".join(str(p[i].index + 1) for i in range(3)))
if __name__ == "__main__":
main()
JavaScript
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let inputLines = [];
rl.on("line", (line) => {
inputLines.push(line);
}).on("close", () => {
const input = inputLines;
const [m, n] = input[0].split(",").map(Number);
// 判断数据合法性
if (n < 3 || n > 100 || m < 3 || m > 10) {
console.log(-1);
return;
}
const players = Array.from({ length: n }, () => ({
// 记录1 - 10分数的数量
score: Array(11).fill(0),
// 总分
sum: 0,
index: 0,
}));
for (let i = 1; i <= m; i++) {
const scores = input[i].split(",").map(Number);
for (let j = 0; j < scores.length; j++) {
const score = scores[j];
// 判断分数合法性
if (score < 1 || score > 10) {
console.log(-1);
return;
}
players[j].score[score]++;
players[j].sum += score;
players[j].index = j;
}
}
players.sort((a, b) => {
if (a.sum !== b.sum) {
return b.sum - a.sum;
}
// 总分相等按照分数排序
for (let i = 10; i >= 1; i--) {
if (a.score[i] !== b.score[i]) {
return b.score[i] - a.score[i];
}
}
return 0;
});
console.log(
players
.slice(0, 3)
.map((player) => player.index + 1)
.join(",")
);
});
Go
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
// Person 结构体
type Person struct {
score []int // 记录选手获得[1-10]各个分数的数量
sum int // 统计用户的获得的总分
index int // 记录选手下标
}
// 比较函数:按照 sum 从大到小排序,sum 相等时按照 score 从大到小排序
func cmp(a, b Person) bool {
if a.sum == b.sum {
for i := 10; i >= 1; i-- {
if a.score[i] != b.score[i] {
return a.score[i] > b.score[i]
}
}
}
return a.sum > b.sum
}
func main() {
reader := bufio.NewReader(os.Stdin)
// 读取第一行输入
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
inputs := strings.Split(line, ",")
m, _ := strconv.Atoi(inputs[0])
n, _ := strconv.Atoi(inputs[1])
// 判断数据合法性
if n < 3 || n > 100 || m < 3 || m > 10 {
fmt.Println(-1)
return
}
// 初始化选手数据
players := make([]Person, n)
for i := 0; i < n; i++ {
players[i] = Person{
score: make([]int, 11),
sum: 0,
index: i,
}
}
// 读取每轮分数
for i := 0; i < m; i++ {
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
scores := strings.Split(line, ",")
for j, scoreStr := range scores {
score, _ := strconv.Atoi(scoreStr)
// 判断分数合法性
if score < 1 || score > 10 {
fmt.Println(-1)
return
}
players[j].score[score]++
players[j].sum += score
}
}
// 排序选手
sort.Slice(players, func(i, j int) bool {
return cmp(players[i], players[j])
})
// 输出前三名选手的下标
for i := 0; i < 3; i++ {
if i > 0 {
fmt.Print(",")
}
fmt.Print(players[i].index + 1)
}
}
标签:10,return,比赛,int,sum,score,line
From: https://blog.csdn.net/qq_45776114/article/details/145191786