01 排序【PAT B1015】德才论

该博客讨论了如何使用Java实现对考生数据的分类和排序。第一版中,通过创建四个不同的ArrayList来存储不同类别的考生,然后分别对每个列表进行排序。第二版则优化了这一过程,通过在ExamStudent类中增加一个级别字段,将所有考生存储在一个ArrayList中,减少排序时的复杂度。然而,尽管进行了优化,但在某些测试点仍然存在运行超时的问题,作者希望寻求进一步的解决方案。
摘要由CSDN通过智能技术生成

1 题目

在这里插入图片描述

2 代码

2.1 第一版

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class B1015{
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");

        int M = Integer.parseInt(input[0]);
        int L = Integer.parseInt(input[1]);
        int H = Integer.parseInt(input[2]);

        ArrayList<ExamStudent> oneArr = new ArrayList<>();
        ArrayList<ExamStudent> twoArr = new ArrayList<>();
        ArrayList<ExamStudent> thrArr = new ArrayList<>();
        ArrayList<ExamStudent> fouArr = new ArrayList<>();

        for (int i = 0; i < M; i++) {
            String[] str = br.readLine().split(" ");
            String id = str[0];
            int D = Integer.parseInt(str[1]);
            int C = Integer.parseInt(str[2]);

            if (D < L || C < L)
                continue;
            ExamStudent student = new ExamStudent(id, D, C);
            if (D >= H && C >= H) {
                oneArr.add(student);
            } else if (D >= H && C < H) {
                twoArr.add(student);
            } else if (D < H && C < H && D >= C) {
                thrArr.add(student);
            } else {
                fouArr.add(student);
            }
        }

        Collections.sort(oneArr, new Comparator<ExamStudent>() {
            @Override
            public int compare(ExamStudent o1, ExamStudent o2) {
                if (o1.getdValue() + o1.getcValue() != o2.getdValue() + o2.getcValue())
                    return o2.getdValue() + o2.getcValue() - o1.getdValue() - o1.getcValue();
                else if (o1.getdValue() != o2.getdValue())
                    return o2.getdValue() - o1.getdValue();

                return o1.getId().compareTo(o2.getId());
            }
        });

        Collections.sort(twoArr, new Comparator<ExamStudent>() {
            @Override
            public int compare(ExamStudent o1, ExamStudent o2) {
                if (o1.getdValue() + o1.getcValue() != o2.getdValue() + o2.getcValue())
                    return o2.getdValue() + o2.getcValue() - o1.getdValue() - o1.getcValue();
                else if (o1.getdValue() != o2.getdValue())
                    return o2.getdValue() - o1.getdValue();

                return o1.getId().compareTo(o2.getId());
            }
        });

        Collections.sort(thrArr, new Comparator<ExamStudent>() {
            @Override
            public int compare(ExamStudent o1, ExamStudent o2) {
                if (o1.getdValue() + o1.getcValue() != o2.getdValue() + o2.getcValue())
                    return o2.getdValue() + o2.getcValue() - o1.getdValue() - o1.getcValue();
                else if (o1.getdValue() != o2.getdValue())
                    return o2.getdValue() - o1.getdValue();

                return o1.getId().compareTo(o2.getId());
            }
        });

        Collections.sort(fouArr, new Comparator<ExamStudent>() {
            @Override
            public int compare(ExamStudent o1, ExamStudent o2) {
                if (o1.getdValue() + o1.getcValue() != o2.getdValue() + o2.getcValue())
                    return o2.getdValue() + o2.getcValue() - o1.getdValue() - o1.getcValue();
                else if (o1.getdValue() != o2.getdValue())
                    return o2.getdValue() - o1.getdValue();

                return o1.getId().compareTo(o2.getId());
            }
        });

        System.out.println(oneArr.size() + twoArr.size() + thrArr.size() + fouArr.size());
        for (ExamStudent student : oneArr) {
            System.out.println(student.getId() + " " + student.getdValue() + " " + student.getcValue());
        }
        for (ExamStudent student : twoArr) {
            System.out.println(student.getId() + " " + student.getdValue() + " " + student.getcValue());
        }
        for (ExamStudent student : thrArr) {
            System.out.println(student.getId() + " " + student.getdValue() + " " + student.getcValue());
        }
        for (ExamStudent student : fouArr) {
            System.out.println(student.getId() + " " + student.getdValue() + " " + student.getcValue());
        }
    }
}

class ExamStudent {
    private String id;
    private int dValue;
    private int cValue;

    public ExamStudent(String id, int dValue, int cValue) {
        this.id = id;
        this.dValue = dValue;
        this.cValue = cValue;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getdValue() {
        return dValue;
    }

    public void setdValue(int dValue) {
        this.dValue = dValue;
    }

    public int getcValue() {
        return cValue;
    }

    public void setcValue(int cValue) {
        this.cValue = cValue;
    }
}

在这里插入图片描述

2.2 第二版

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class B1015 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");

        int M = Integer.parseInt(input[0]);
        int L = Integer.parseInt(input[1]);
        int H = Integer.parseInt(input[2]);

        ArrayList<ExamStudent> arr = new ArrayList<>();

        for (int i = 0; i < M; i++) {
            String[] str = br.readLine().split(" ");
            String id = str[0];
            int D = Integer.parseInt(str[1]);
            int C = Integer.parseInt(str[2]);

            if (D < L || C < L)
                continue;
            if (D >= H && C >= H) {
                arr.add(new ExamStudent(id, D, C, 1));
            } else if (D >= H && C < H) {
                arr.add(new ExamStudent(id, D, C, 2));
            } else if (D < H && C < H && D >= C) {
                arr.add(new ExamStudent(id, D, C, 3));
            } else {
                arr.add(new ExamStudent(id, D, C, 4));
            }
        }

        Collections.sort(arr, new Comparator<ExamStudent>() {
            @Override
            public int compare(ExamStudent o1, ExamStudent o2) {
                if (o2.getLevel() != o1.getLevel())
                    return o1.getLevel() - o2.getLevel();
                else if (o1.getdValue() + o1.getcValue() != o2.getdValue() + o2.getcValue())
                    return o2.getdValue() + o2.getcValue() - o1.getdValue() - o1.getcValue();
                else if (o1.getdValue() != o2.getdValue())
                    return o2.getdValue() - o1.getdValue();

                return o1.getId().compareTo(o2.getId());
            }
        });

        System.out.println(arr.size());
        for (ExamStudent student : arr) {
            System.out.println(student.getId() + " " + student.getdValue() + " " + student.getcValue());
        }
    }
}

class ExamStudent {
    private String id;
    private int dValue;
    private int cValue;
    private int level;

    public ExamStudent(String id, int dValue, int cValue, int level) {
        this.id = id;
        this.dValue = dValue;
        this.cValue = cValue;
        this.level = level;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getdValue() {
        return dValue;
    }

    public void setdValue(int dValue) {
        this.dValue = dValue;
    }

    public int getcValue() {
        return cValue;
    }

    public void setcValue(int cValue) {
        this.cValue = cValue;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
}

在这里插入图片描述

3 要点

(1)首先想到的是利用4个数组存储不同类别的考生,但是内容较为庞杂,重复的代码较多,借鉴网上的经验,在每个考生处标明类别,可以在一个数组中进行排序。
(2)但是在Java中进行的排序,测试点2、3和4会运行超时,如果有更好的方法,望告知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是聪聪黄吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值