首页 > 其他分享 >[ 比赛 ]

[ 比赛 ]

时间:2025-01-17 20:01:37浏览次数:3  
标签:10 return 比赛 int sum score line

比赛

真题目录: 点击去查看

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,无效分数

题解

思路:

  1. 接收输入时,判断数据合法性,包括(n,m,score)的值,是否符合条件
  2. 统计每个成员得到的总分,以及得到[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

相关文章

  • 网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你
    目录前言一、内容简介二、读者对象三、专家推荐四、全书目录前言CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几个突出的问题:1)线下CTF比赛培训中存在严重的“最后一公......
  • 2024年安徽省中银杯省赛网络系统管理比赛
    S1hostnameS1!spanning-treemoderstpspanning-treemst0priority4096spanning-tree!nocwmp!servicedhcp!ipdhcppoolpool_APoption138ip11.1.0.20411.1.0.205network172.17.10.0255.255.255.0default-router172.17.10.254!ipdhcppool......
  • 小白5分钟入门蓝桥杯比赛
    蓝桥杯的比赛模式是限时四小时,参赛者需要在规定时间内完成十道题目。题目类型包括填空题和编程题。比赛采用OI(OnlineJudge)赛制,即使编程题的答案不完全正确,只要符合测试样例,也能得分,允许暴力解题,因此也被称为“暴力杯”或“O钱杯。官网有比赛的详细细节信息,一定要码住!连接高......
  • 支付宝动物运动会官方API接口,动物运动会官方API接口,动物运动会比赛结果API,运动会API,支
    2025年最热、最火爆的游戏——支付宝动物运动会,正在如火如荼地进行!超强的三方监管机制让得这场赛事达到了公平、公正、公开,三方监管平台分别是:支付宝官方APP、游戏官网 www.zfbgame.com 以及淘宝APP共同携手,确保每一位参与者的权益!支付宝动物运动会是支付宝应用内一项趣味性......
  • 一些比赛的题解
    A把第二个字符串反转,然后对于第一个字符串中为#的位置,输出第二个字符串中对应位置的字符即可。B考虑枚举答案(需要注意不能二分),假设当前枚举的答案为\(res\),只需考虑怎么判定该答案是否合法。不难发现,找到\(res\)的不同的两个倍数同时属于这个区间,\(res\)就是合法的。C......
  • 基于决策树的机器学习算法实现足球比赛预测分析推荐
    决策树是一种常用的机器学习算法,它可以用于分类和回归任务。在足球比赛中预测“大小球”(即比赛的总进球数是否超过某个阈值)可以看作是一个分类问题。以下是一个使用决策树预测足球大小球的代码实现流程解析:1.数据准备首先,需要准备训练和测试数据集。这些数据集应该包含与比......
  • noip2024比赛总结
    信息学竞赛对学生综合能力的要求较高,例如数学、逻辑思维、思考速度、思考全面性等各个方面,同时,其考察学生耐性、专注度、严谨性、刻苦程度等性格有关方面,是一门综合性强,难度高,学习过程坎坷曲折的学科竞赛。在考完联赛noip之后,我想分享一下自己的比赛感受与学习经验,希望能对同学们......
  • 零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
    CTF(CaptureTheFlag)比赛中的高频解题技巧通常涵盖了以下几类技术,涉及从逆向工程、二进制漏洞利用到Web安全、密码学等多个领域。以下是一些高频解题技巧:1.逆向工程(ReverseEngineering)静态分析:通过阅读二进制文件的源代码或反编译代码(......
  • 零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
    CTF(CaptureTheFlag)比赛中的高频解题技巧通常涵盖了以下几类技术,涉及从逆向工程、二进制漏洞利用到Web安全、密码学等多个领域。以下是一些高频解题技巧:1.逆向工程(ReverseEngineering)静态分析:通过阅读二进制文件的源代码或反编译代码......
  • 如何利用人工智能预测足球比赛结果?这才是关键!
    随着科技的发展,人工智能(AI)在各个领域已经展现出惊人的潜力,尤其是在体育分析中。尤其是足球,这项全球最受欢迎的运动,如何利用AI进行比赛结果预测,成为业内关注的焦点。本文将深入探讨AI在足球比赛预测中的应用,尤其是从分类模型到预测模型的演变,以及如何在复杂的体育环境中做出准确......