题目描述
有n位同学同时找老师答疑。每位同学都预先估计了自己答疑的时。
老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑位同学答疑的过程如下
1首先进入办公室,编号为的同学需要 s,毫秒的时间2.然后同学问问题老师解答,编号为的同学需要 a;毫秒的时
3.答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可 以忽略
4.最后同学收拾东西离开办公室,需要 e;毫秒的时间。一般需要10秒、20秒或30 秒,即e;取值为 10000,20000 或30000
位同学离开办公室后,紧接着下一位同学就可以进入办公室了
答疑从0时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群里面发消息的时刻之和最小。
输入描述
输入第一行包含一个整数n,表示同学的数量
接下来n行,描述每位同学的时间。其中第行包含三个整数siai,ei,意义如上所述
其中有,1<n<1000,1<s;< 60000,1<a<10,eiE 10000,20000,30000,即ei一定是10000、20000、30000之一
输出描述
输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。
输入输出样例
示例
输入
10000 10000 10000
20000 50000 20000
30000 20000 30000
输出
280000
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = scan.nextInt();
long[][] arr = new long[n][2];
for(int i = 0;i < n;i++) {
arr[i] = new long[2];
arr[i][0] = scan.nextLong()+scan.nextLong();
//将进入办公室和解答时间合二为一,便于计算
arr[i][1] = scan.nextLong();
}
Main.sort(arr, 0, n - 1);
long eve = 0;
long sum = 0;//同学发消息时间之和
for(int i = 0;i < n;i++) {
eve = arr[i][0] + eve;
sum += eve;
eve += arr[i][1];
}
System.out.println(sum);
scan.close();
}
public static void sort(long[][] arr,int left,int right) {//快速排序
int i,j;
long[] key = new long[2];
if(left > right) return ;
i = left;
j = right;
key = arr[i];
while(i < j) {
while(i < j&&arr[j][0]+arr[j][1] >= key[0]+key[1]) j--;
//比较的依据应该是每个同学的总答疑时间
arr[i] = arr[j];
while(i < j&&arr[i][0]+arr[i][1] <= key[0]+key[1]) i++;
arr[j] = arr[i];
}
arr[i] = key;
sort(arr,left,i - 1);
sort(arr,i+1,right);
}
}
注意:这道题要搞清楚n同学们问题的先后顺序应该由什么决定。假设有A,B两位同学,A同学所用时间为a1,a2(a1为进入办公室和解题时间之和),B所用时间为b1,b2。若A先进教室,所用时间sum = a1+(a1+a2+b1),若B先进教室sum = b1+(b1+b2+a1),由两式可知是A还是B先进教室取决于a1+a2和b1+b2,因此在本题题解中,在使用排序时就应该以一个同学的问题总时间为比较的标准进行排序。