今天刷dy发现了一个这样子的题目,题目给出n个人和r个水龙头,以及每个人的打水时间,让我们求他们花费的总时间最小是多少?这里我们要明确一个事情,题目要求是他们花费的总时间,而不是水龙头工作的整个过程的总耗时。

假设有ABCD四个人,两个水龙头,总时间 = A的时间 + B的时间 + C的时间 + D的时间,而不是看谁最晚结束的时间。既然明确了这个概念,我们再往下推假设有A和B两人,A单独打水的时间是1分钟,B单独打水的时间是5分钟,那么既可以A先打水,也可以B先打水。

如果是A先打水,那么B打水的时间就是排队时间+单独打水时间即 1+5=6 分钟,总时间就是1+1+5=7分钟。

如果是B先打水,那么A打水的时间就是排队时间+单独打水时间即 5+1=6 分钟,总时间就是5+5+1=11分钟。

可以看出如果先让打水时间少的人打水,那么后面的人排队的时间就会变少,即让所有人的打水时间从小到大排个序,再进行打水就是最少的时候。

假设每个人的打水时间放在T数组中。

在最少的时候这种情况下,抽象到整个问题,第一次打水的r个人不需要排队,所以总时间就是他们的和,从第r+1个人开始就需要排队,排队时间就是前面的人的打水时间,这一个人的打水总时间即 T[i] + T[i-r] ,最后再把所有人的时间加到一起就是答案了。

听懂了的就给博主点一个关注吧!

import java.util.Arrays;
import java.util.Scanner;

public class Water {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();//总共有n个人
        int r = scan.nextInt();//总共有r个水龙头
        int[] T = new int[n];//每个人单独的打水时间
        for (int i=0;i<n;i++){
            T[i] = scan.nextInt();
        }
        Arrays.sort(T);//把每个人的打水时间从小到大排序
        int res = 0;
        for (int i=0;i<r;i++){
            res += T[i];
        }
        for (int i=r;i<n;i++){
            T[i] = T[i-r] + T[i];//从第r个人开始,每一个人的打水时间要加上他的排队时间
            res += T[i];
        }
        System.out.print(res);
    }
}

更多推荐