没啥好说的,没有用到好的算法,我做的顶多有个插入排序(当时为使用线性表还是链表而纠结,最后还是使用了线性表)。
这道题做了一天,各种错误,主要是因为不够熟练导致的。
可以参考柳神写的1012java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class T1012 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] firstL = reader.readLine().split(" ");
int N = Integer.parseInt(firstL[0]);
int M = Integer.parseInt(firstL[1]);
String[] id = new String[N];
// 第i行表示第i个学生的四科成绩
int[] c = new int[N];
int[] m = new int[N];
int[] e = new int[N];
int[] a = new int[N];
// 将各科成绩分别排序,用来找到要查学生的最大排名
int[] c_s = new int[N];
int[] m_s = new int[N];
int[] e_s = new int[N];
int[] a_s = new int[N];
// 初始化c m e a 等数组
for (int i = 0; i < N; i++) {
String[] split = reader.readLine().split(" ");
id[i] = split[0];
c[i] = Integer.parseInt(split[1]);
m[i] = Integer.parseInt(split[2]);
e[i] = Integer.parseInt(split[3]);
a[i] = (c[i] + m[i] + e[i]) / 3;
sort(c_s, i, c[i]);
sort(m_s, i, m[i]);
sort(e_s, i, e[i]);
sort(a_s, i, a[i]);
}
int max;
char[] ch = { 'C', 'M', 'E', 'A' };
String[] idd = new String[M];
for (int i = 0; i < M; i++) {
idd[i] = reader.readLine();
}
// 开始查找最大排名
for (int i = 0; i < M; i++) {
max = 0;
int lable = 3;
int symbol = -1;
for (int j = 0; j < N; j++) {
if (idd[i].equals(id[j])) {
symbol = j;
break;
}
}
if (symbol != -1) {
max = rank(a_s, a[symbol]);
int tmp = rank(c_s, c[symbol]);
if (tmp < max) {
max = tmp;
lable = 0;
}
tmp = rank(m_s, m[symbol]);
if (tmp < max) {
max = tmp;
lable = 1;
}
tmp = rank(e_s, e[symbol]);
if (tmp < max) {
max = tmp;
lable = 2;
}
System.out.println("" + max + " " + ch[lable]);
} else {
System.out.println("N/A");
}
}
}
// 排序
public static void sort(int[] c_s, int i, int k) {
if (i == 0) {
c_s[0] = k;
}
for (int j = i - 1; j >= 0; j--) {
if (c_s[j] < k) {
c_s[j + 1] = c_s[j];
if (j == 0) {
c_s[j] = k;
}
} else {
c_s[j + 1] = k;
break;
}
}
}
// 得到排名
public static int rank(int[] grades, int grade) {
int rank = 0;
for (int i = 0; i < grades.length; i++) {
if (grade == grades[i]) {
rank = i + 1;
break;
}
}
return rank;
}
}