贪心算法 排队打水问题 (Java)
·

今天刷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);
}
}
更多推荐

所有评论(0)