运动会
题目
问题描述
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
思路分析
- 根据题目我们可以得知,我们要进行两个步骤:
- 为每一个项目的选手进行排名
- 为选手们赋分后,计算每一位选手的总分
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; }