百木园-与人分享,
就是让自己快乐。

蓝桥杯【答疑】

蓝桥杯【答疑】

题目描述

分析

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

代码

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<Stu>(){//自己定义一个比较器进行比较
            @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<0) {
                    return -1;
                } else if (o1.two>=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前。


来源:https://www.cnblogs.com/KJplant/p/17266545.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 蓝桥杯【答疑】

相关推荐

  • 暂无文章