蓝桥杯—算法训练基础—排队接水2(贪心)

 

问题描述

  有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

  1. 思路分析:半天前看到这道题本来很疑惑,想着安排打水最少时间不就是这个打完水了下个跟上不就行了?一直没想出来哈哈。
  2. 其实通过带例子中的数据,我们可以发现,这个求最少打水时间不是说打水开始到结束花了多久时间,而是每个人从开始到打水完毕所花费的时间,是打水过程加上打水之前等待了的时间。 
  3. 所以这里我们肯定是先将数组排序,依次去接水(让接水时长短的先接,这样等待时间会短很多)
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)

 天道酬勤,一起加油!

评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴有想法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值