3 条题解

  • 0
    @ 2025-10-4 10:45:23

    这道题要用什么算法其实是写在标签里了,这个算法就叫贪心算法。贪心算法主要就是在每一步都找这一步最快的方法,也就是说,假如要先让一个人打水,得让打水最快的来,就能最快地走完这一步,然后第一个人就不用管了,后面的也是重复这个步骤。

    不过,题目有个要读懂的点,总时间是什么意思?比如说,假设有3个人到一个水龙头打水,他们打水的时间分别是1, 2, 3(单位: min), 对于第一个打水的人来说要1(min),第二个打水的人来说要1 + 2 = 3(min),对于第三个打水的人来说要1 + 2 + 3 = 3 + 3 = 6(min)。总时间就是 1 + 3 + 6 = 10(min),当然,这也是最短的总打水时间。所以一个人需要的打水时间是 排队时间 + 自己的打水时间,总的打水时间就是 每个人需要的打水时间之和。

    写成数学公式更容易看些:

    一个人需要的打水时间=排队时间+自己的打水时间一个人需要的打水时间 = 排队时间 + 自己的打水时间 总打水时间=(一个人需要的打水时间)总打水时间 = \sum(一个人需要的打水时间)

    下面是我的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int compare(const void *a, const void *b) {
    	return (*(int *)a - *(int *)b);
    }
    
    
    int main() {
    	int n, m;
    	scanf("%d %d", &n, &m);
    	int need_time[55] = {0};
    	
    	for (int i = 0; i < n; i ++) {
    		scanf("%d", &need_time[i]);
    	}
    	qsort(need_time, n, sizeof(int), compare);
    	
    	if (n > m) {
    		for (int i = m; i < n; i ++) {
    			need_time[i] += need_time[i - m];
    		}
    	}
    	
    	int total_time = 0;
    	for (int i = 0; i < n; i ++) {
    		total_time += need_time[i];
    	}
    	
    	printf("%d", total_time);
    	
    	return 0;
    }
    

    信息

    ID
    18
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    1091
    已通过
    364
    上传者