最小延迟调度问题C语言实现
给定等待服务的客户集合A={1,2,···,n},预计对客户i的服务时长为ti>0,T=(t1,t2,···tn),客户i希望的服务完成时刻为di>0,D=(d1,d2,···,dn);一个调度f:A→N,f(i)为客户i的开始时刻。如果对客户i的服务在di之前结束,那么对客户i的服务没有延迟,即如果在di之后结束,那么这个服务就被延迟了,延迟的时间等于该服务的实际完成时刻f(i)+ti减去预期结束时刻di。一个调度f的最大延迟是所有客户延迟时长的最大值 max{f(i)+t-di}。附图所示是不同调度下的最大延迟。使用贪心策略找出一个调度使得最大延迟达到最小。
代码实现:
#include<stdio.h>
#define Max 100
struct A {
int id; // 客户id
int spendtime; // 对客户服务的时长
int deadline; // 客户希望服务完成的时刻
}a[Max];
// 快速排序
void QuickSort(struct A a[], int low, int high) {
if (low < high) {
int i = low;
int j = high;
struct A k = a[low];
while (i < j) {
while (i < j && a[j].deadline >= k.deadline) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i].deadline < k.deadline) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
a[i] = k;
QuickSort(a, low, i - 1);
QuickSort(a, i + 1, high);
}
}
int main() {
int A_num, spendtime, deadline, start = 0, Max_delay;
int flag[Max]; // 记录延迟数组
printf("请输入客户成员个数:");
scanf("%d", &A_num);
for (int i = 0; i < A_num; i++) {
a[i].id = i + 1;
printf("请输入预计对%d号客户服务的时长:", i + 1);
scanf("%d", &spendtime);
a[i].spendtime = spendtime;
printf("请输入%d号客户希望服务完成的时刻:", i + 1);
scanf("%d", &deadline);
a[i].deadline = deadline;
}
QuickSort(a, 0, A_num - 1);
printf("服务顺序为:\n");
for (int i = 0; i < A_num; i++) {
printf("%d号客户服务时间为[%d,%d] ", a[i].id, start, start + a[i].spendtime);
if (a[i].deadline > start + a[i].spendtime) {
flag[i] = 0;
printf("无延迟!\n");
}
else {
flag[i] = start + a[i].spendtime - a[i].deadline;
printf("延迟为:%d\n", flag[i]);
}
start += a[i].spendtime;
}
Max_delay = flag[0];
for (int i = 1; i < A_num; i++) {
if (flag[i] > Max_delay) {
Max_delay = flag[i];
}
}
printf("最大延迟为:%d\n",Max_delay);
}