蓝桥杯 排队接水2 贪心 python

该问题涉及调度优化,通过排序和选择最小时间的人优先打水,以减少总体等待时间。算法首先将所有人按装水时间从小到大排序,然后按水龙头数量分组,计算每组的等待时间并累加,最后输出总时间。这种方法确保了总时间的最小化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

  有N个人排队到M个水龙头去打水,他们装满水桶的时间T1,T2……Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?

输入格式

  第1行:两个整数n和m,n表示人的个数,m表示水龙头的个数;
  第2行,n个数分别表示n个人装水的时间
  数据范围:m<=n/3,n<=1000,t<3000。

输出格式

  一个整数,表示总花费的最少时间。

样例输入

6 2
5 4 6 2 1 7

样例输出

40

n,m=map(int,input().split())
la=list(map(int,input().split()))
sum=0
la.sort()
for i in range(m):
    lc=la[i:n:m]
    count=0
    for j in lc:
        count=count+j
        sum=sum+count
print(sum)

### 排队接水问题Python 实现 排队接水问题是经典的贪心算法应用之一,其核心在于找到一种最优策略来最小化所有人等待时间的总和。以下是基于此问题的一个通用解决方案。 #### 1. 贪心算法的核心思路 为了使总的等待时间最少,应优先让所需接水时间较短的人先完成接水操作[^1]。这是因为越早结束接水的人会减少后续人员的整体等待时间。 #### 2. 示例代码实现 下面是一个完整的 Python 示例代码: ```python def min_waiting_time(n, times): """ 计算最小化的总等待时间。 参数: n (int): 队伍人数 times (list): 每个人所需的接水时间列表 返回: int: 总等待时间 """ # 对接水时间进行从小到大排序 times.sort() total_wait = 0 # 计算每个人的累计等待时间 for i in range(n): remaining_people = n - (i + 1) total_wait += times[i] * remaining_people return total_wait # 输入处理部分 if __name__ == "__main__": n = int(input("请输入队伍人数:")) times = list(map(int, input(f"请输入{n}人的接水时间(以空格分隔):").split())) result = min_waiting_time(n, times) print(f"最小化的总等待时间为:{result}") ``` 上述代码实现了如下功能: - **输入**: 用户需提供队伍人数 `n` 和每个人对应的接水时间数组 `times`。 - **逻辑**: 将接水时间按升序排列后计算每一轮剩余人数的累积等待时间[^2]。 - **输出**: 输出最终的最小化总等待时间。 #### 3. 复杂度分析 该方法的时间复杂度主要由排序决定,即 \(O(N \log N)\),其中 \(N\) 是队伍长度。由于每次只需遍历一次已排序数组即可得出结果,因此整体效率较高[^3]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值