用java解决小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数
时间: 2024-02-16 11:00:37 浏览: 48
以下是用Java实现的代码:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int n = sc.nextInt();
if (n == 0) {
break;
}
int[] t = new int[n];
int[] k = new int[n];
for (int i = 0; i < n; i++) {
t[i] = sc.nextInt();
k[i] = sc.nextInt();
}
int[] order = getOptimalOrder(n, t, k);
int totalScore = getTotalScore(n, t, k, order);
System.out.println(totalScore);
}
}
// 获取作业的最优顺序
public static int[] getOptimalOrder(int n, int[] t, int[] k) {
int[] order = new int[n];
for (int i = 0; i < n; i++) {
order[i] = i;
}
Arrays.sort(order, (a, b) -> t[a] - t[b]); // 按照最后提交时间从小到大排序
int curTime = 0; // 当前时间
for (int i = 0; i < n; i++) {
int j = order[i];
if (t[j] >= curTime) { // 可以在最后提交时间前完成
curTime++;
} else { // 必须在最后提交时间后完成
k[j] *= -1; // 将扣分变成负数,方便后面计算总扣分
}
}
Arrays.sort(order, (a, b) -> k[a] - k[b]); // 按照逾期扣分从小到大排序
return order;
}
// 计算总扣分
public static int getTotalScore(int n, int[] t, int[] k, int[] order) {
int curTime = 0; // 当前时间
int totalScore = 0; // 总扣分
for (int i = 0; i < n; i++) {
int j = order[i];
if (t[j] >= curTime) { // 可以在最后提交时间前完成
curTime++;
} else { // 必须在最后提交时间后完成
totalScore += k[j]; // 累加逾期扣分
}
}
return totalScore;
}
}
```
我们先用Scanner读入输入,每次读入一个整数n,如果n为0就结束程序。接着,我们读入n个作业的最后提交时间和逾期扣分,存储在数组t和k中。然后,我们调用`getOptimalOrder`函数获取作业的最优顺序,并调用`getTotalScore`函数计算总扣分。最后,我们输出总扣分即可。
`getOptimalOrder`函数按照最后提交时间从小到大排序作业,然后采用贪心算法选择最优的作业。具体来说,我们维护一个当前时间curTime,初始值为0。然后,从排序后的作业列表中选择一个最早的作业i,如果它的最后提交时间ti大于等于curTime,那么就可以在最后提交时间前完成它,因此直接完成它即可。否则,如果它的最后提交时间ti小于curTime,那么就必须在最后提交时间后完成它,因此需要将扣分ki变成负数,方便后面计算总扣分。完成作业i后,更新当前时间curTime,然后继续从剩余的作业中选择最优的作业进行完成,直到全部作业完成为止。最后,按照逾期扣分从小到大排序作业,并返回作业的顺序。
`getTotalScore`函数按照作业的最优顺序计算总扣分。具体来说,我们维护一个当前时间curTime,初始值为0,以及一个总扣分totalScore,初始值为0。然后,按照作业的最优顺序选择作业进行完成。如果作业i可以在最后提交时间前完成,那么就将当前时间加1。否则,如果作业i必须在最后提交时间后完成,那么就将逾期扣分ki累加到总扣分中。完成作业i后,继续从剩余的作业中选择最优的作业进行完成,直到全部作业完成为止。最后,返回总扣分即可。