历届真题 答疑

190 阅读1分钟

题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。

老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下:

首先进入办公室,编号为 i 的同学需要 si​ 毫秒的时间。 然后同学问问题老师解答,编号为 i 的同学需要 ai​ 毫秒的时间。 答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。 最后同学收拾东西离开办公室,需要 ei​ 毫秒的时间。一般需要 10 秒、20 秒或 30 秒,即 ei​ 取值为 10000,20000 或 30000。 一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。

答疑从 0 时刻开始(划重点)。老师想合理的安排答疑的顺序,使得同学们在课程群里面发消息的时刻之和最小。

image.png

import java.util.Arrays;
import java.util.Scanner;

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a7857b62362846d6a552f3b58193f16f~tplv-k3u1fbpfcp-watermark.image?)

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ff1eb8f1a696409e931f0ab5acc2224f~tplv-k3u1fbpfcp-watermark.image?)
//n si qi ei

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n =sc.nextInt();
		User[] user = new User[n];
		for(int i = 0;i < n;i++) {
			int a = sc.nextInt();
			int a1 = sc.nextInt();
			int a2 = sc.nextInt();
			user[i] = new User(a+a1,a2,a1+a+a2);
		}
		Arrays.sort(user);
		long ans=0,m=0;
		for(int i=0;i<n;i++) {
			ans+=m+=user[i].ab;
			m+=user[i].c;
		}
		System.out.println(ans);
	}
	
	static class User implements Comparable<User>{
		
		int ab;
		int c;
		int sum;
		
		
		
		public int getAb() {
			return ab;
		}



		public void setAb(int ab) {
			this.ab = ab;
		}



		public int getC() {
			return c;
		}



		public void setC(int c) {
			this.c = c;
		}



		public int getSum() {
			return sum;
		}



		public void setSum(int sum) {
			this.sum = sum;
		}

		
		
		public User() {
		
		}

		public User(int ab, int c, int sum) {
			super();
			this.ab = ab;
			this.c = c;
			this.sum = sum;
		}



		@Override
		public int compareTo(User o) {
			// TODO Auto-generated method stub
			return this.sum - o.sum;
		}
		
	}
}