PAT乙级1085 PAT单位排行 测试点1、2答案错误 java

img

img


思路:为了利用数组的sort()方法,自定义学校类,属性是Map.Entry<>类型,key为学校名,value为学校总分以及参考人数,重写compareTo()方法。在主方法中排序,并按题目要求输出
代码如下:


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();
    }
}

img

主要是测试点1、2的问题,我查了一下,基本上java版本的最后两个都是超时。答案错误我想不出来自己写得具体哪里有问题。