小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。问题贪心算法设计
时间: 2024-04-29 08:20:05 浏览: 67
可以按照以下步骤设计贪心算法:
1. 定义一个作业列表,将每个作业的最后提交时间和逾期扣分存储在其中。
2. 按照最后提交时间从小到大对作业列表进行排序。
3. 设计一个变量total_score,表示当前的总扣分,初始化为0。
4. 遍历排序后的作业列表,对于每个作业,计算它的逾期扣分。如果当前时间小于等于它的最后提交时间,说明没有逾期,不需要扣分,否则按照题目给出的逾期扣分计算扣分数。将扣分数加到total_score中。
5. 返回total_score作为最终的答案。
按照上述步骤实现贪心算法,可以求出小明做作业的顺序,以便扣最少的分数。代码实现如下所示:
相关问题
小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。输入作业数量n、每个作业的最后提交时间t以及逾期扣分k,以输入n=0作为结束,给出python代码
以下是一个使用 Python 实现的代码示例:
```python
while True:
n = int(input("请输入作业数量:"))
if n == 0:
break
t = []
k = []
for i in range(n):
t_i, k_i = map(int, input("请输入第{}个作业的最后提交时间和逾期扣分,以空格分隔:".format(i+1)).split())
t.append(t_i)
k.append(k_i)
# 将所有作业按照最后提交时间从小到大排序,如果最后提交时间相同,则按照逾期扣分从小到大排序
homeworks = [(t[i], k[i]) for i in range(n)]
homeworks = sorted(homeworks, key=lambda x: (x[0], x[1]))
# 按照排好序的顺序一个一个地完成作业
total_score = 0
for i in range(n):
deadline, score = homeworks[i]
if deadline > i + 1: # 如果逾期了
total_score += score
print("小明需要扣除的总分数为:", total_score)
```
这个代码使用了一个无限循环,每次循环中根据输入的作业数量和具体的作业信息计算出小明需要扣除的总分数。当输入作业数量为 0 时,循环结束。
小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,
好的,我理解了你的问题。你想知道小明完成这些作业的最小扣分是多少。这是一个经典的贪心问题,可以使用贪心算法来解决。
首先,我们需要按照最后提交时间对作业进行排序,以确保我们始终按照最后提交时间的顺序完成作业。然后,我们可以按照以下方式完成作业:
1. 对于每个作业,如果它在最后提交时间之前就完成了,那么我们不会受到任何扣分,直接完成该作业。
2. 如果作业在最后提交时间之后完成,则需要扣除相应的逾期扣分。我们应该尽可能地减少逾期扣分,因此我们应该首先完成逾期扣分最低的作业。
下面是 Python 代码实现:
```
n = int(input())
while n > 0:
t = list(map(int, input().split()))
k = list(map(int, input().split()))
assignments = list(zip(t, k))
assignments.sort()
total_penalty = 0
current_time = 0
for deadline, penalty in assignments:
if current_time <= deadline:
current_time += 1
if current_time > deadline:
total_penalty += penalty
print(total_penalty)
n = int(input())
```
希望这可以回答你的问题!
阅读全文