答疑
答疑
题目
输入输出样例
示例
输入
3
10000 10000 10000
20000 50000 20000
30000 20000 30000
输出
280000
解题思路
贪心
对每个学生所需的总时间按升序排序
然后逐个遍历,计算当前发信息的时间,加入总时间(要输出的结果)
由于前一个学生出去后一个才可以进来,所以后面要在加上一个出去的时间
解题代码
注意
会爆int
package 蓝桥杯.真题2020;
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Stream;
public class 答疑 {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static long in() throws IOException {
in.nextToken();
return (long) in.nval;
}
public static void main(String[] args) throws IOException {
//读入
int n = (int) in();
Stu[] s = new Stu[n];
for ( int i=0; i<n; i++ ) {
s[i] = new Stu();
s[i].s = in();
s[i].a = in();
s[i].e = in();
}
//排序
//按照每个人所需的总时间升序
Arrays.sort(s, new Comparator<Stu>() {
@Override
public int compare(Stu o1, Stu o2) {
return (int) ((o1.s+o1.a+o1.e)-(o2.s+o2.a+o2.e));
}
});
long ans = 0;
long cur = 0;
for ( int i=0; i<n; i++ ) {
//当前发信息的时间 距离开始的时间
cur = cur+s[i].s+s[i].a;//发信息为答疑完发信息
ans += cur;//加入答案
cur += s[i].e;//出去需要时间,当前时间向后
}
System.out.println(ans);
}
}
class Stu {
long s;//进入的时间
long a;//答疑时间
long e;//收拾出去的时间
}