评委评分
2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型
华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解
题目描述
一个有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,无效分数
题解
思路
考点:字符串处理 + 字符串排序
- 自定义结构体
Person,存储每个选手的编号、总分和各分数数量。 - 接收输入数据,记录每个选手获得的总分以及获得各种评分的数量。
- 自定义排序:按照
总分进行从大到小排序,总分相等按照高评分数量进行排序 - 输出排序之后的前3名选手下标。
额外注意:接收输入
n , m以及每个选手打分的score的数据范围时判断是否合法。不合法直接输出-1.
code
#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMAX_M10#defineMAX_N100typedefstruct{intid;// 选手编号inttotalScore;// 总分intscore[11];// 各分数数量 1~10}Person;// 排序函数:先按总分降序,再按高分数量降序intcompare(constvoid*a,constvoid*b){Person*p1=(Person*)a;Person*p2=(Person*)b;if(p2->totalScore!=p1->totalScore)returnp2->totalScore-p1->totalScore;for(inti=10;i>=1;i--){if(p2->score[i]!=p1->score[i])returnp2->score[i]-p1->score[i];}return0;}intmain(){intM,N;if(scanf("%d,%d\n",&M,&N)!=2)return0;// 检查合法性if(M<3||M>10||N<3||N>100){printf("-1\n");return0;}Person sports[MAX_N];// 初始化for(inti=0;i<N;i++){sports[i].id=i+1;sports[i].totalScore=0;memset(sports[i].score,0,sizeof(sports[i].score));}charline[500];for(intj=0;j<M;j++){if(!fgets(line,sizeof(line),stdin))return0;intidx=0;// 进行输入根据,分割并进行合法性检验char*token=strtok(line,",");while(token!=NULL){intscore=atoi(token);if(score<1||score>10){printf("-1\n");return0;}sports[idx].totalScore+=score;sports[idx].score[score]++;idx++;token=strtok(NULL,",");}}// 自定义排序规则qsort(sports,N,sizeof(Person),compare);// 输出结果printf("%d,%d,%d\n",sports[0].id,sports[1].id,sports[2].id);return0;}其它语言题解链接
华为OD机试双机位C卷 - 评委评分 (C++ & Python & JAVA & JS & GO)