小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数
时间: 2024-02-20 21:00:09 浏览: 18
这是一个贪心算法的题目,我们可以按照一定的规则选择作业的顺序。
一般来说,我们可以按照以下规则选择作业:
1. 选择逾期扣分最高的作业优先完成。
2. 如果存在多个逾期扣分最高的作业,我们可以选择最先截止的作业优先完成。
按照以上规则,我们可以得到以下Java代码实现:
```java
import java.util.*;
class Homework implements Comparable<Homework> {
int t; // 最后提交时间
int k; // 逾期扣分
public Homework(int t, int k) {
this.t = t;
this.k = k;
}
// 实现Comparable接口,按照逾期扣分从大到小排序
public int compareTo(Homework other) {
return other.k - this.k;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Homework> list = new ArrayList<>();
while (true) {
int n = sc.nextInt();
if (n == 0) {
break;
}
for (int i = 0; i < n; i++) {
int t = sc.nextInt();
int k = sc.nextInt();
list.add(new Homework(t, k));
}
// 按照逾期扣分从大到小排序
Collections.sort(list);
int time = 0; // 当前时间
int score = 0; // 总扣分
for (Homework hw : list) {
time++; // 时间加1
if (time > hw.t) { // 逾期
score += hw.k; // 扣分
}
}
System.out.println(score);
list.clear(); // 清空列表
}
}
}
```
以上代码中,我们将作业封装成一个Homework类,并实现Comparable接口,按照逾期扣分从大到小排序。然后,我们读入每个作业的最后提交时间和逾期扣分,将它们封装成Homework对象并加入到列表中。最后,我们按照以上规则选择作业的顺序,并计算总共的扣分。循环读入直到n=0结束。
希望能够帮到您!