蓝桥杯 算法训练 接水问题

本文介绍了一种解决多人排队接水问题的高效算法。通过每次寻找并减少当前接水队伍中最小接水量,实现资源的最优化分配,确保整体等待时间最短。算法详细流程包括:对当前接水人员进行排序,减去最小接水量,加入新成员,并重复此过程直至无人排队,最后加上最大接水量所需时间。

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

在这里插入图片描述

思路:每回找出在龙头下接水所需最小的接水量,将所有在接水的减去这个最小接水量,再加入一个新的同学开始接水,重复此过程。当后面没人时,最后加上最大接水量所需时间即可。
例一:
步骤一. 4 4 1 ··· 排序后 1 4 4 ···减去后 0 3 3 ···重新加入后 2 3 3
步骤二. 2 3 3 ··· 排序后 2 3 3 ···减去后 0 1 1 ···重新加入后 1 1 1
步骤三. 1 1 1 ··· 排序后 1 1 1 ···减去后 0 0 0

#include <iostream>
using namespace std;
#include <algorithm>
int main()
{
	int n, m, i, j, t = 0, e;
	int a[10005], b[105];//a->每个人接水量,b->龙头对应每个人的接水量 
	cin >> n >> m;
	for (i = 0 ; i < n ; i++)
	{
		cin >> a[i];
	}
	for (i = 0 ; i < m ; i++)
	{
		b[i] = a[i];//将m个人的龙头分别放在对应的龙头下面 
	}
	for (i = m ; i < n ; i++)
	{
		sort(b, b + m); //求出能接完一桶对应的最少的放水量 
		e = b[0];//对每个龙头所需放水最少就能接完其中一桶的量
		for (j = 0 ; j < m ; j++)
		{
			b[j] -= e;//所有的水桶减去能接满最少一桶水的量 
		}
		t += e;//加上所需时间 
		b[0] = a[i];//将另外一桶水加入进来,继续放水 
	}
	sort(b, b + m);
	t += b[m - 1];
	cout << t;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值