72: Optimal Services

这是一个经典的贪心问题,被称为“最短作业优先(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() 函数释放动态分配的内存空间。

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

我们用一个图表来理解,设a_n为第n个顾客的服务时间,b_n为第n个顾客的等待时间

a1a2a3a4
b10|a1
b2等a10|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

(注意换行符!!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值