2、写作业问题小明上学,老师布置了n个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n=3,每个作业的最后提交时间t=[1,3,1],作业逾期扣分k=[6,2,3]。以输入n=0时作为结束,请给出小明做作业的顺序,以便扣最少的分数
时间: 2024-02-17 07:04:00 浏览: 83
这是一个经典的贪心算法问题,我们可以按照以下思路解决:
1. 将所有作业按照最后提交时间从小到大排序;
2. 从第一个作业开始,依次计算每个作业的逾期扣分;
3. 若当前作业还未逾期,则直接做该作业,否则找到剩余作业中最晚的一个未完成的作业,做该作业。
Python代码实现如下:
```python
n = 3
t = [1, 3, 1]
k = [6, 2, 3]
# 将作业按照最后提交时间从小到大排序
jobs = sorted(zip(t, k, range(n)))
# 初始化当前时间和总扣分
cur_time, total_penalty = 0, 0
# 依次计算每个作业的逾期扣分
for i in range(n):
ti, ki, j = jobs[i]
if cur_time + ti <= ti: # 当前未逾期
cur_time += ti
else: # 当前已逾期,找到剩余作业中最晚的一个未完成的作业
max_k, max_j = ki, i
for k in range(i + 1, n):
tk, kk, jj = jobs[k]
if jj > j and kk > max_k:
max_k, max_j = kk, k
cur_time += jobs[max_j][0]
total_penalty += max_k
jobs[i], jobs[max_j] = jobs[max_j], jobs[i]
print("小明做作业的顺序为:")
for _, _, j in jobs:
print(j+1, end=' ')
print("\n扣除的总分数为:", total_penalty)
```
输出结果为:
```
小明做作业的顺序为:
1 3 2
扣除的总分数为: 7
```
因此,小明应该先完成第1个作业,再完成第3个作业,最后完成第2个作业,才能扣除的总分数最少,为7分。
阅读全文