这是一个经典的贪心问题,被称为“最短作业优先(SJF)”调度问题。其贪心策略为将服务时间最短的顾客优先服务。
具体实现可以将顾客按照服务时间从小到大排序,然后依次安排服务。可以用一个数组来保存每个顾客的服务时间,再用一个变量记录当前已服务顾客的总服务时间,依次加上每个顾客的服务时间即可。
这里引入一下c语言的动态数组的使用(非必需,可以了解一下)
在C语言中,动态数组一般使用指针来实现。动态数组的大小可以在运行时动态地分配和释放,不需要在编译时指定数组大小,这使得动态数组的使用更加灵活。下面举一个例子来说明动态数组的使用:
#include <stdio.h>
#include <stdlib.h>//提供动态分配的函数
int main() {
int n;
scanf("%d", &n);
int *arr = (int*)malloc(n * sizeof(int)); // 动态分配n个int类型的空间
free(arr); // 动态释放内存空间
//等价于 int arr[n];
return 0;
}
在这个例子中,通过调用 malloc()
函数来分配 n * sizeof(int)
大小的内存空间,并将指针类型的变量 arr
指向该内存空间。通过下标 arr[i]
可以访问动态数组 arr
中的元素。在程序结束时,需要调用 free()
函数释放动态分配的内存空间。
然后来思考这个时间怎么计算
我们用一个图表来理解,设为第n个顾客的服务时间,为第n个顾客的等待时间
a1 | a2 | a3 | a4 | |
b1 | 0|a1 | |||
b2 | 等a1 | 0|a2 | ||
b3 | 等a1 | 等a2 | 0|a3 | |
b4 | 等a1 | 等a2 | 等a3 | 0|a4 |
显然第n个顾客共花费时间为an的前n项和sn
我们用sum来求sn,用total_time来记录总时间
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
void bubble_sort(int arr[], int len) {
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
bubble_sort(arr, n);
int total_time = 0, sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
total_time += sum;
}
double avn_time = (double)total_time / n;
printf("%.2lf\n", avn_time);//看样例保留的二位
free(arr);
return 0;
}
AC
(注意换行符!!)