用C语言贪心算法小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。
时间: 2024-02-13 08:05:29 浏览: 117
好的,这是一个经典的贪心算法问题。我们可以采用按照最后提交时间从小到大排序的方式来贪心地解决这个问题。
具体来说,我们先将所有作业按照最后提交时间从小到大排序,然后依次安排小明做作业。对于每个作业,我们计算它逾期的时间(如果没有逾期就是0),然后将它的逾期扣分除以逾期时间得到“每天的扣分”。我们将所有作业按照每天的扣分从小到大排序,然后依次做作业直到完成所有作业。
对于这个具体的例子,按照最后提交时间从小到大排序后,作业的顺序应该是[1,3,2]。计算每个作业的逾期时间和每天的扣分如下表所示:
作业 | 最后提交时间 | 逾期时间 | 逾期扣分 | 每天的扣分
--- | --- | --- | --- | ---
1 | 1 | 0 | 6 | 6
3 | 1 | 2 | 2 | 1
2 | 3 | 0 | 3 | 3
按照每天的扣分从小到大排序后,作业的顺序应该是[3,2,1]。小明应该按照这个顺序完成作业,这样他扣的分数最少。
完整的C语言代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int t; // 最后提交时间
int k; // 逾期扣分
} Homework;
// 比较函数,按照最后提交时间从小到大排序
int cmp(const void* a, const void* b) {
return ((Homework*)a)->t - ((Homework*)b)->t;
}
int main() {
int n = 0;
while (1) {
printf("请输入作业数量:");
scanf("%d", &n);
if (n == 0) {
break;
}
Homework* hws = (Homework*)malloc(n * sizeof(Homework));
for (int i = 0; i < n; i++) {
printf("请输入第%d个作业的最后提交时间和逾期扣分:", i + 1);
scanf("%d%d", &hws[i].t, &hws[i].k);
}
qsort(hws, n, sizeof(Homework), cmp);
int day = 0;
int score = 0;
for (int i = 0; i < n; i++) {
day += 1;
if (day > hws[i].t) {
score += hws[i].k * (day - hws[i].t);
}
}
printf("完成作业的顺序为:");
for (int i = 0; i < n; i++) {
printf("%d ", hws[i].t);
}
printf("\n");
printf("扣的分数为:%d\n", score);
free(hws);
}
return 0;
}
```
阅读全文