蓝桥杯【答疑】题目描述

分析

这是一个贪心算法,要所得的时刻之和最小,而且下一个同学需要等上一个同学结束以后才能进行,因此需要对所耗总时间进行有小到大的排序,总时间相同的同学则对前两步时间之和有小到大进行排序,最后算出时间之和即可。

代码

import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;public class Tset {    public static void main(String[] args){        Scanner scan = new Scanner(System.in);        int n = scan.nextInt();        Stu[] stu = new Stu[n];        for(int i=0;i<n;i++){            stu[i] = new Stu(scan.nextInt(),scan.nextInt(),scan.nextInt());        }        scan.close();        Arrays.sort(stu, new Comparator(){//自己定义一个比较器进行比较            @Override            public int compare(Stu o1,Stu o2) {//比较返回1,o1放后面,返回2,o2放后面                if(o1.all-o2.all>0){                    return 1;                } else if (o1.all-o2.all=o2.two) {                    return 1;                }else {                    return -1;                }            }        });        long min=0,time=0;//注意要使用long型,不然结果会超出        for(int i=0;i<n;i++){            min+=stu[i].s+stu[i].a+time;            time+=stu[i].all;        }        System.out.println(min);    }}//Stu类,用于储存n个学生的信息class Stu{    int s;    int a;    int e;    int two;    int all;    Stu(int s,int a,int e){        this.s = s;        this.a = a;        this.e = e;        two = s+a;        all = s+a+e;    }}

代码分析

在该段代码中,最重要的是使用了java.util.Comparator中的接口,并重写了int compare(T o1,T o2)方法,对o1,o2进行比较并排序,返回1时o1放在o2后,反之放在o2前。