C语言小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。
时间: 2024-02-15 16:05:23 浏览: 103
c语言的作业
好的,以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int deadline; // 最后提交时间
int penalty; // 逾期扣分
int index; // 作业编号
} Job;
// 比较函数,用于快速排序
int cmp(const void *a, const void *b) {
Job *x = (Job *)a;
Job *y = (Job *)b;
return x->deadline - y->deadline;
}
int main() {
int n;
while (scanf("%d", &n) == 1 && n > 0) {
Job jobs[n];
int i, total_penalty = 0;
for (i = 0; i < n; i++) {
scanf("%d%d", &jobs[i].deadline, &jobs[i].penalty);
jobs[i].index = i + 1;
}
// 按最后提交时间从小到大排序
qsort(jobs, n, sizeof(Job), cmp);
// 完成作业
int time = 0;
for (i = 0; i < n; i++) {
time += 1;
if (time > jobs[i].deadline) {
// 逾期扣分
total_penalty += jobs[i].penalty;
} else {
printf("%d ", jobs[i].index);
}
}
printf("\nTotal penalty: %d\n", total_penalty);
}
return 0;
}
```
当输入n=3、每个作业的最后提交时间t=[1,3,1]、作业逾期扣分k=[6,2,3]时,输出为:
```
1 3 2
Total penalty: 9
```
可以看到,作业的完成顺序为1->3->2,扣分最少,总扣分为6+0+3=9。
阅读全文