9、试题 I
【问题描述】
n 个运动员参加一个由 m 项运动组成的运动会,要求每个运动员参加每个项目。
每个运动员在每个项目都有一个成绩,成绩越大排名越靠前。每个项目,不同运功员的成绩不会相同,因此排名不会相同。(但是不同项目可能成绩会相同)
每个项目的前 k 名分别获得 k 到 1 分,第 i 名获得 max(k+1-i, 0) 分。
每个运动员的总分就是他在每个项目上获得的分数之和。
请计算每个运动员的总分。
【输入格式】
输入的第一行包含两个整数 n, m, k,用一个空格分隔。
接下来 n 行,每行包含 m 个整数,第 i 行第 j 个整数表示第 i 个运动员在第 j 项比赛的成绩。
import java.util.Scanner;
public class demo09 {
static Scanner scanner;
static int n;
static int m;
static int k;
static int[][] grade;//存储所有成绩
static int[] groupGrade;//用于存储当前项比赛成绩
static int[] finalGrade;//存储选手最终得分
static int max=0 ;
static boolean flag = true;
static int num = 1;
public static void main(String args[])
{
scanner= new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
k = scanner.nextInt();
grade = new int[n][m];
groupGrade = new int[n];
finalGrade = new int[n];
for(int i=0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
grade[i][j]=scanner.nextInt();
}
}
for(int j = 0;j<m;j++) {
for(int i=0;i<n;i++)
{
groupGrade[i]=grade[i][j];//获取本项比赛分数
}
A:while(true) {
for(int i=0;i<n;i++)
{
max = Math.max(groupGrade[i], max);
}
for(int i=0;i<n;i++)
{
if(max==0)
{
num=1;
break A;
}
if(max==groupGrade[i])
{
finalGrade[i]+=getGrade(num);
num++;
groupGrade[i] = 0;
max = 0;
continue A;
}
}
}
}
for(int e : finalGrade)
{
System.out.print(e+" ");
}
}
public static int getGrade(int x)
{
return Math.max(k+1-x, 0);
}
}