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

发布时间 2023-10-27 21:15:48作者: 山远尽成云

运动会

题目

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

样例输入
3 5 2
5 3 1 5 12
2 4 2 34 1
8 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

蓝桥杯 运动会

思路分析

  1. 根据题目我们可以得知,我们要进行两个步骤:
  • 为每一个项目的选手进行排名
  • 为选手们赋分后,计算每一位选手的总分

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

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

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

代码

 

#include <iostream>
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<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>a[i][j];//输入数据
        }
    }
    for(int j=0;j<m;j++)//项目
    {
        for(int i=0;i<n;i++)//运动员1
        {
            cnt=n;//设置初始名次为最低
            for(int k=0;k<n;k++)//运动员2
            {
                if(a[i][j]>a[k][j])//可以比作运动员1与每个运动员(包括自己)比较成绩。成绩高,名次前进
                {
                    cnt--;
                }
                b[i][j]=cnt;//存储名次
            }
        }
    }
    for(int j=0;j<m;j++)//项目
    {
        for(int i=0;i<n;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<n;i++)
    {
        cout<<c[i]<<" ";
    }
    return 0;
}