蓝桥杯【答疑】题目描述
分析
这是一个贪心算法,要所得的时刻之和最小,而且下一个同学需要等上一个同学结束以后才能进行,因此需要对所耗总时间进行有小到大的排序,总时间相同的同学则对前两步时间之和有小到大进行排序,最后算出时间之和即可。
代码
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前。