问题描述
有N个人排队到M个水龙头去打水,他们装满水桶的时间T1,T2……Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?
输入格式
第1行:两个整数n和m,n表示人的个数,m表示水龙头的个数;
第2行,n个数分别表示n个人装水的时间
数据范围:m<=n/3,n<=1000,t<3000。输出格式
一个整数,表示总花费的最少时间。
资源限制
时间限制:1.0s 内存限制:256.0MB
样例输入
6 2
5 4 6 2 1 7样例输出
40
- 思路分析:半天前看到这道题本来很疑惑,想着安排打水最少时间不就是这个打完水了下个跟上不就行了?一直没想出来哈哈。
- 其实通过带例子中的数据,我们可以发现,这个求最少打水时间不是说打水开始到结束花了多久时间,而是每个人从开始到打水完毕所花费的时间,是打水过程加上打水之前等待了的时间。
- 所以这里我们肯定是先将数组排序,依次去接水(让接水时长短的先接,这样等待时间会短很多)
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner k=new Scanner(System.in);
int n=k.nextInt();//表示有n个人接水
int m=k.nextInt();//表示有m个水龙头
int [] time=new int[n];
int [] num=new int[m];
int snum=0,i=0,j=0;
for(i=0;i<n;i++)
{
time[i]=k.nextInt();//输入每个人对应的接水过程耗费时间
}
Arrays.sort(time);//从小到大排序
for(i=0;i<n;)//注意:这里不能习惯性的写上i++,因为第二个for语句执行了这个操作,否则会多加
{
for(j=0;j<m&&i<n;i++,j++)//这里最好在本子上列一下,时间短的依次打水,有规则的分配
{
num[j]=num[j]+time[i];//因为要加上等待的时间,这个人前面在同一个水龙头耗费的时间和就是他等待的时间
snum+=num[j];//累加求和
}
}
System.out.println(snum);
}
}
下面是思路形式(可以在本上写一哈):
n=6,m=2; | |
5 4 6 2 1 7排列后为1 2 4 5 6 7 | |
水龙头A 水龙头B | |
1 (1) 2 (2) | |
4 ( 1+4) 5 ( 2+5) | |
6 (1 +4+6) 7 (2+5+7) | |
17 (1+1+4+1+4+6) 23 ( 2+2+5+2+5+7) | |
40(1+1+4+1+4+6+2+2+5+2+5+7) |
天道酬勤,一起加油!