【每日例题】蓝桥杯 c++ 运动会

2026-07-25 15:46:57

运动会

题目

问题描述n个运动员参加一个由m项运动组成的运动会,要求每个运动员参加每个项目。每个运动员在每个项目都有一个成绩,成绩越大排名越靠前。每个项目,不同运功员的成绩不会相同,因此排名不会相同。(但是不同项目可能成绩会相同)每个项目的前k名分别获得k到1分,第主名获得max(k+1一i,0)分。每个运动员的总分就是他在每个项目上获得的分数之和。请计算每个运动员的总分。输入格式输入的第—行包含两个整数n, m, k,用一个空格分隔。接下来n行,每行包含m个整数,第主行第j个整数表示第i个运动员在第j项比赛的成绩。输出格式输出—行包含n个整数,依次表示每个运动员的总分,相邻的整数之间用一个空格分隔。

样例输入3 5 25 3 1 5 122 4 2 34 18 6 3 2 2样例输出

4 4 7样例说明第1个运动员得分为:1+0+0+1+2=4第2个运动员得分为:0+1+1+2+0 =4第3个运动员得分为:2+2+2+0+1=7

蓝桥杯 运动会

思路分析

根据题目我们可以得知,我们要进行两个步骤:

为每一个项目的选手进行排名

为选手们赋分后,计算每一位选手的总分

2.为了达成上面的目标,我们需要建立三个数组,a数组与b数组都是二维数组,a数组用来存放键盘输入的数据,b数组用来存放每个项目选手的排名;c数组则是一维数组,用来存放选手的分数。

3.我们要如何为选手的每一个项目进行排名呢?通过题目我们可以知道,行为选手的每一个项目成绩,列为项目的每一位选手成绩,所以,我们只需要比较同一列的成绩大小,排出排名后,将名次赋值给b数组即可

4.要算出选手的分数,则直接套用题目的关系即可

代码

#include

using namespace std;

int main()

{

int n,m,k;

int cnt;//名次

cin>>n>>m>>k;

int a[n][m]={},b[n][m]={},c[n]={};//a输入数据,b项目名次,c分数

for(int i=0;i

{

for(int j=0;j

{

cin>>a[i][j];//输入数据

}

}

for(int j=0;j

{

for(int i=0;i

{

cnt=n;//设置初始名次为最低

for(int k=0;k

{

if(a[i][j]>a[k][j])//可以比作运动员1与每个运动员(包括自己)比较成绩。成绩高,名次前进

{

cnt--;

}

b[i][j]=cnt;//存储名次

}

}

}

for(int j=0;j

{

for(int i=0;i

{

if(b[i][j]<=k)//前k名

{

c[i]+=(k+1)-b[i][j];

}

else

{

c[i]+=max(k+1-b[i][j],0);

}

}

}

for(int i=0;i

{

cout<

}

return 0;

}