写作业问题 算法小明上学,老师布置了·n·个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间 ti及其逾期的扣分 ki。已知作业 n·=·3,每个作业的最后提交时间 t·=·[1,3,1],作业逾期扣分 k·=·[6,2,
时间: 2024-05-18 16:15:56 浏览: 210
假设小明按照最优策略完成作业,即尽可能地减少扣分,可以使用贪心算法来解决这个问题。具体思路如下:
1. 按照作业的最后提交时间 ti,将作业按照 ti 从小到大排序,作业序列为 [1,3,2]。
2. 遍历作业序列,对于每个作业 i,计算其逾期的时间 di = max(0, ti - i),即最后提交时间减去实际完成时间(如果实际完成时间超过最后提交时间,则 di 为 0)。
3. 计算完成作业 i 所需要的总时间 ti + di,即最后提交时间加上逾期时间,记为 si。
4. 将作业按照完成时间 si 从小到大排序,完成作业的顺序为 [1,3,2]。
5. 计算小明的总扣分 ki_total = sum(ki * max(0, di)),即每个作业的逾期扣分乘上逾期时间的总和。
因此,小明应该按照 [1,3,2] 的顺序完成作业,总扣分为 ki_total = 6 * 0 + 2 * 0 + 4 * 1 = 4 分。
相关问题
用python贪心算法写一个写作业问题 小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序和扣的最少分数
好的,这是一个经典的贪心算法问题。根据题意,我们需要按照最后提交时间从小到大的顺序完成作业,以尽可能避免逾期扣分。代码如下:
``` python
def homework(n, t, k):
"""
:param n: 作业数量
:param t: 最后提交时间列表
:param k: 逾期扣分列表
"""
# 按照最后提交时间从小到大排序
sorted_homework = sorted(zip(t, k))
# 已完成作业数量
finished = 0
# 总扣分
total_penalty = 0
# 遍历每个作业
for deadline, penalty in sorted_homework:
if finished < deadline:
# 在最后提交时间之前完成作业,不扣分
finished += 1
total_penalty += penalty
return total_penalty
# 示例
n = 3
t = [1, 3, 1]
k = [6, 2, 3]
print(homework(n, t, k)) # 输出 5
```
在这个示例中,最优的做作业顺序是先完成第1个和第3个作业,再完成第2个作业,总共扣分为5分。
算法设计java写作业问题 小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。
这是一个典型的贪心算法问题,按照最小化逾期扣分的原则,我们可以按照最后提交时间从小到大排序,然后依次完成作业。具体实现可以参考以下Java代码:
```java
import java.util.*;
public class Homework {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
List<HomeworkItem> items = new ArrayList<>();
int n = input.nextInt();
while (n > 0) {
int t = input.nextInt();
int k = input.nextInt();
items.add(new HomeworkItem(t, k));
n--;
}
Collections.sort(items);
int sum = 0;
int deadline = 0;
for (HomeworkItem item : items) {
deadline += item.time;
sum += item.penalty * Math.max(deadline - item.deadline, 0);
}
System.out.println(sum);
}
static class HomeworkItem implements Comparable<HomeworkItem> {
int time;
int deadline;
int penalty;
public HomeworkItem(int t, int k) {
time = t;
deadline = t;
penalty = k;
}
@Override
public int compareTo(HomeworkItem o) {
return deadline - o.deadline;
}
}
}
```
输入样例:
```
3
1 6
3 2
1 3
0
```
输出样例:
```
13
```
说明:小明按照顺序完成第1个作业(提交时间为1,逾期6分)、第3个作业(提交时间为1,逾期3分)和第2个作业(提交时间为3,逾期2分),总共扣分13分。
阅读全文