PAT甲级1012

没啥好说的,没有用到好的算法,我做的顶多有个插入排序(当时为使用线性表还是链表而纠结,最后还是使用了线性表)。
这道题做了一天,各种错误,主要是因为不够熟练导致的。
可以参考柳神写的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;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值