小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。通过java语言用贪心算法实现问题代码
时间: 2024-02-22 20:00:48 浏览: 86
信奥贪心算法 的java代码
以下是用Java语言实现的贪心算法代码:
```
import java.util.*;
public class HomeworkOrder {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = 0;
List<Homework> homeworkList = new ArrayList<>();
// 输入作业信息
while (true) {
System.out.print("请输入第" + (++n) + "个作业的截止日期和逾期扣分(以空格分隔,如:1 6):");
int t = input.nextInt();
int k = input.nextInt();
if (t == 0) {
break;
}
Homework homework = new Homework(t, k);
homeworkList.add(homework);
}
// 对作业按照截止日期升序排序
Collections.sort(homeworkList);
// 计算最小扣分
int totalScore = 0;
for (int i = 0; i < homeworkList.size(); i++) {
Homework homework = homeworkList.get(i);
totalScore += homework.k;
int j = i + 1;
while (j < homeworkList.size() && homeworkList.get(j).t == homework.t) {
totalScore += homeworkList.get(j).k;
j++;
}
i = j - 1;
}
// 输出结果
System.out.println("小明做作业的顺序为:");
for (Homework homework : homeworkList) {
System.out.print(homework.toString() + " ");
}
System.out.println("\n扣分最少为:" + totalScore);
}
}
class Homework implements Comparable<Homework> {
int t; // 截止日期
int k; // 逾期扣分
public Homework(int t, int k) {
this.t = t;
this.k = k;
}
@Override
public int compareTo(Homework o) {
return this.t - o.t;
}
@Override
public String toString() {
return "(" + t + "," + k + ")";
}
}
```
代码思路:
1. 首先使用一个列表存储所有的作业信息;
2. 按照截止日期升序排序所有作业;
3. 遍历作业列表,对于每一个作业,计算它和它后面所有截止日期相同的作业的总扣分,然后跳过这些作业;
4. 输出小明做作业的顺序和最少扣分。
运行结果:
```
请输入第1个作业的截止日期和逾期扣分(以空格分隔,如:1 6):1 6
请输入第2个作业的截止日期和逾期扣分(以空格分隔,如:1 6):3 2
请输入第3个作业的截止日期和逾期扣分(以空格分隔,如:1 6):1 3
请输入第4个作业的截止日期和逾期扣分(以空格分隔,如:1 6):0 0
小明做作业的顺序为:
(1,6) (1,3) (3,2)
扣分最少为:11
```
阅读全文