import java.io.*;
import java.util.*;
//自定义学校类,属性为以学校小写名为key,学校总分和参考人数组成的int数组为value的Map.Entry<>
class school implements Comparable<school>{
Map.Entry<String,int[]> info;
public school(Map.Entry<String,int[]> info){
this.info=info;
}
@Override //按题目要求重写排序方式
public int compareTo(school sc){
int score1=this.info.getValue()[0];
int score2=sc.info.getValue()[0];
int count1=this.info.getValue()[1];
int count2=sc.info.getValue()[1];
String name1=this.info.getKey();
String name2=this.info.getKey();
//分数相等按分数排
if(score1!=score2){
return -(score1-score2);
}
//分数不等按参考人数排
else if(count1!=count2){
return (count1-count2);
}
//参考人数还不等按名字排
else{
return name1.compareTo(name2);
}
}
}
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int N=(int)in.nval;
//单位名是key,总成绩以及参考人数作为数组是value
Map<String,double[]> m=new HashMap<>();
//遍历每一行信息,添加进Map对象
for(int i=1;i<=N;i++){
in.nextToken();
String ID=in.sval;
char c=ID.charAt(0);
in.nextToken();
int score=(int)in.nval;
in.nextToken();
String name=in.sval.toLowerCase();
//如果map中已经有这个名字了
if(m.containsKey(name)){
//获取之前的总分和参考人数
double originScore=m.get(name)[0];
double count=m.get(name)[1];
double[] array=new double[2];
array[1]=count+1;
//判断考试级别,按题目要求更新数组中的总成绩元素
if(c=='T'){
array[0]=originScore+1.5*score;
}
else if(c=='A'){
array[0]=originScore+score;
}
else{
array[0]=originScore+score/1.5;
}
//用新value覆盖之前的value
m.put(name,array);
}
//如果没有这个名字
else{
//初始化一个数组,把这个数组直接添加进Map对象
double[] array={0,1};
if(c=='T'){
array[0]=score*1.5;
}
else if(c=='A'){
array[0]=score;
}
else{
array[0]=score/1.5;
}
m.put(name,array);
}
}
//由于加权总分是整数,所以这里创建一个临时的Map来存放整数部分
Map<String,int[]> temp=new HashMap<>();
for(Map.Entry<String,double[]> info:m.entrySet()){
double[] d=info.getValue();
int[] i={(int)d[0],(int)d[1]};
temp.put(info.getKey(),i);
}
//之所以用数组不用动态数组是因为数组方便查询索引
school[] rank=new school[m.size()];
//把entrySet()中的元素复制进入数组
int index=0;
for(Map.Entry<String,int[]> info:temp.entrySet()){
rank[index]=new school(info);
index++;
}
//降序排列
Arrays.sort(rank);
out.println(rank.length);
//start:排名的起始位置(特指总分相同)
int start=1;
//before:上一个学校的分数
int before=rank[1].info.getValue()[0];
for(int i=0;i<rank.length;i++){
//如果这个学校和上一个学校的分数一样,那么排名就是上一个学校的排名,以此类推,也即第一个和该学校总分相同的学校的排名,即start
if(rank[i].info.getValue()[0]==before){
out.println(start+" "+rank[i].info.getKey()+" "+rank[i].info.getValue()[0]+" "+rank[i].info.getValue()[1]);
}
//如果不一样,start就是这个学校的索引值+1,更新start
else{
out.println((i+1)+" "+rank[i].info.getKey()+" "+rank[i].info.getValue()[0]+" "+rank[i].info.getValue()[1]);
start=i+1;
}
//更新before
before=rank[i].info.getValue()[0];
}
out.flush();
}
}
主要是测试点1、2的问题,我查了一下,基本上java版本的最后两个都是超时。答案错误我想不出来自己写得具体哪里有问题。