72: Optimal Services

72: Optimal Services_第1张图片

这是一个经典的贪心问题,被称为“最短作业优先(SJF)”调度问题。其贪心策略为将服务时间最短的顾客优先服务。

具体实现可以将顾客按照服务时间从小到大排序,然后依次安排服务。可以用一个数组来保存每个顾客的服务时间,再用一个变量记录当前已服务顾客的总服务时间,依次加上每个顾客的服务时间即可。

这里引入一下c语言的动态数组的使用(非必需,可以了解一下)

在C语言中,动态数组一般使用指针来实现。动态数组的大小可以在运行时动态地分配和释放,不需要在编译时指定数组大小,这使得动态数组的使用更加灵活。下面举一个例子来说明动态数组的使用:

#include 
#include //提供动态分配的函数
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() 函数释放动态分配的内存空间。

然后来思考这个时间怎么计算

我们用一个图表来理解,设a_n为第n个顾客的服务时间,b_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 
#include 
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

(注意换行符!!)

你可能感兴趣的:(SWUST,OJ,算法)