- 实验目的
- 掌握贪心算法的基本思想和设计步骤。
- 理解贪心算法的贪心选择性质。
- 实验任务
任务:完成多机调度问题的求解
设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1≤i≤n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务完成的时间总和除以n。
输入 N个顾客的服务时间,并设置服务窗口数量s,请编程输出最小的平均等待时间和每个窗口上顾客接受服务的顺序。
#include<stdio.h> #include<string.h> #include<stdlib.h> void sort(int a[],int n){ for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ if(a[i]>a[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; } } } } int greedy(int a[],int n,int s){ int j=0; int *se=(int *)malloc(sizeof(int)*s); int *sc=(int *)malloc(sizeof(int)*s); for(int i=0;i<s;i++){ se[i]=0; sc[i]=0; } for(int i=0;i<n;i++){ se[j]+=a[i]; sc[j]+=se[j]; j++; if(j==s) j=0; } int sum=0; for(int i=0;i<s;i++) sum+=sc[i]; return sum/n; } int main(){ int n,s; printf("请输入顾客数目(n):"); scanf("%d",&n); printf("请输入可服务地方的数目(s):"); scanf("%d",&s); int *t=(int *)malloc(sizeof(int)*n); printf("请依次输入顾客所需服务时间:"); for(int i=0;i<n;i++) scanf("%d",&t[i]); sort(t,n); for(int a=0;a<s;a++){ printf("第%d窗口上顾客接受服务的顺序为:",a+1); for(int i=a;i<n;i=i+s){ printf("%d ",t[i]); } printf("\n"); } int time=greedy(t,n,s); printf("平均等待时间为:%d",time); return 0; } 运行结果: |