PAT 1025. PAT Ranking


我的思路是:新建一个类保存用户id,分数等信息,并实现Comparable接口。

接着就是连续的把同一个组的数据放到ArrayList中,不同的组先排序再放到一个总的ArrayList中。

最后输出就是类似于merge sort 的思想。

需要注意的是:实现Comparable接口的方法是希望分数大的在前面,所以返回的值要恰好反过来,而学号还是按照原来的顺序。


package p1025;

import java.util.*;

public class CopyOfMain {
	
	static class Test implements Comparable<Test>{
		String id;
		int score;
		int rank;
		public Test(String id, int score) {
			this.id = id;
			this.score = score;
		}
		
		@Override
		public int compareTo(Test t2) {
			if(score > t2.score)	return -1;
			if(score < t2.score) return 1;
			if(id.compareTo(t2.id) > 0) return 1;
			if(t2.id.compareTo(id) > 0) return -1;
			return 0;
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// or user Arrays
		ArrayList<ArrayList<Test>> list = new ArrayList<ArrayList<Test>>();
		
		int sum = 0;
		
		int n = sc.nextInt();
		for(int i=0; i<n; i++) {
			ArrayList<Test> ts = new ArrayList<Test>();
			int m = sc.nextInt();
			sum += m;
			for(int j=0; j<m; j++) {
				ts.add(new Test(sc.next(), sc.nextInt()));
			}
			
			Collections.sort(ts);
			
			int pre_score = -1, pre_rank = 1;
			for(int k=0; k<ts.size(); k++) {
				Test t  = ts.get(k);
				if(pre_score != t.score) {
					pre_rank = 1 + k;
					pre_score = t.score;
					t.rank = k + 1;
				} else {
					t.rank = pre_rank;
				}
			}
				
				
			list.add(ts);
		}
		
		System.out.println(sum);
		int[] pos = new int[n];
		Test[] merge = new Test[n];
		for(int i=0; i<n; i++)
			merge[i] = list.get(i).get(0);
		
		
		int pre_score = -1, pre_rank = 1;
		for(int i=0; i<sum; i++) {
			
			// find max
			Test max = null;
			int maxid = -1;
			for(int j=0; j<n; j++) {
				if(merge[j] != null) {
					if(max == null) {
						max = merge[j];
						maxid = j;
					} else if(merge[j].compareTo(max) < 0) {
						max = merge[j];
						maxid = j;
					}
				}
			}
			
			if(pre_score != max.score) {
				System.out.println(max.id + " " + (1+i) + " " + (1+maxid) + " " + max.rank);
				pre_rank = 1 + i;
				pre_score = max.score;
			}
			else
				System.out.println(max.id + " " + pre_rank + " " + (1+maxid) + " " + max.rank);
				
				
			++pos[maxid];
			if(pos[maxid] >= list.get(maxid).size())
				merge[maxid] = null;
			else
				merge[maxid] = list.get(maxid).get(pos[maxid]);
		}
		
	}


}

然而超时了,果然没人用Java考PAT。。。

测试点

测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 115 11660 13/13
1 答案正确 104 12528 6/6
2 答案正确 123 12848 3/3
3 运行超时     0/3
我有重新换了种方法处理输出,先把所有的不同组放到一起,在Collections.sort(),结果还是超时,其实感觉这种方法更耗时,因为这些组都是排好序的,重新在排一遍不划算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值