用python语言解决写作业问题 小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。
时间: 2024-02-18 10:59:30 浏览: 70
好的,这道题可以使用贪心算法来解决。
首先,我们可以将作业按最后提交时间从小到大排序,如果最后提交时间相同,则按逾期扣分从小到大排序。这是因为我们希望先完成最早截止的作业,如果最后提交时间相同,则应该先完成逾期扣分较低的作业。
然后,我们可以按照排序后的顺序依次完成作业,并记录每个作业是否逾期。如果完成某个作业后已经逾期,则在后续完成作业时需要加上该作业的逾期扣分。
下面是使用 Python 语言实现的代码:
```python
def solve(n, t, k):
# 将作业按最后提交时间从小到大排序
jobs = sorted(zip(t, k, range(n)))
ans = 0 # 记录总扣分
cur_time = 0 # 记录当前时间
for i in range(n):
ti, ki, j = jobs[i]
cur_time += 1 # 完成当前作业需要花费 1 天时间
ans += ki * max(0, cur_time - ti) # 如果逾期,则加上逾期扣分
return ans
# 测试样例
n = 3
t = [1, 3, 1]
k = [6, 2, 3]
print(solve(n, t, k)) # 输出 17
```
这里的 `sorted` 函数默认按元组的第一个元素排序,如果第一个元素相同,则按第二个元素排序。由于我们需要按两个元素排序,因此我们可以直接将元组 `(ti, ki, j)` 作为排序的关键字。
阅读全文