【算法】接水问题-自己的思考和解决过程。

【学校实验+蓝桥杯题目】接水问题:学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。现在有n名同学准备接水,他们的初始接水顺序已经确定...... 接水问题【问题描述】【输入格式】【输出格式】【输入案例】输入输出样例 1 说明思路代码实现 【问题描述】 学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是 阅读详情

最近,喜欢在oj上刷算法了。。还是新手,希望有人来一起交流交流。。

贴上接水问题的描述:

  学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打 开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m, 则只有n’个龙头供水,其它m−n’个龙头关闭。 现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

输入描述:

  第1 行2 个整数n 和m,用一个空格隔开,分别表示接水人数和龙头个数。 第2 行n 个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi 表示i 号同学的接水量。

输入样例:

5 3

4 4 1 2 1

输出描述:

  输出只有一行,1 个整数,表示接水所需的总时间。

输出样例:

4

HINT:时间限制:1.0s 内存限制:64.0MB

开始!

       我最初的想法是构造水龙头和人的数据结构,并且这两个数据结构彼此互相联。。然后开始遍历水龙头是否有人在接水,有则将该人的对象保存到当前水龙头,直到接完。很明显,这个思路是可行的哈哈,不过AC不了啊。。想了一晚也没能成功优化。

 

然后第二天在上小程序课的时候我又开始想别的方法进行解决(上课不认真?小程序自学过哈哈,主要听老师讲我没注意的地方)。不久我就想出一个新的思路!

 

就根据输入案例进行分析:

5 3

4 4 1 2 1

第一行:5 是接水人数,3是水龙头数

第二行:5个数分别是5个人的接水量

题目中有个重要的点,就是接水顺序是按编号来的:

        就拿上面例子,第一次接水就是1号2号3号,4号5号等待。当第一次接水完成后,这时1号2号3号剩余的接水量为3 3 0。好,3号同学已经接水完成,所以3号水龙头就换4号同学上去接水,而不能是换5号上去。

下面继续我的分析。

设接水人数为n,水龙头数为m

将接水量放到数组则有 {4, 4, 1, 2, 1},计算总接水量得 12。

我们关注数组的前m位(水龙头数,这里例子为3):{4, 4, 1, 2, 1}

这时数组就逻辑上就分成了两部分,第一部分[0:m-1],第二部分[m:n-1]。第一部分是正在接水的,完成一次接水则里面的元素值减掉1,当第一部分有元素变为0时则表示对应的人已经接完水,可以在数组的第二部分找到不为0的元素与之交换。在这里,有题目中第二个要重要的点,就是当一个人接完水后,后面的人会立马接上,也就是上面交换操作要在接完水的同时刻内完成。【【有点难表述Σ(っ °Д °;)っ】】

下面推演下过程应该就懂了: 

原始:{4, 4, 1, 2, 1}

设时间为 time = 0;未接水人数为 count = 5

while (count>n){

第一次>>接水前:{4, 4, 1, 2, 1} >> 接水后:{3, 3, 0, 2, 1} >> 发现第三个人接水完成,故开始向数组的第二部份遍历不为0的元素进行交换 swap(2,3);count--(count=4)>>{3, 3, 2, 0, 1} >> 完成本次接水 time++(time= 1)

第二次>>接水前:{3, 3, 2, 0, 1} >> 接水后:{2, 2, 1, 0, 1} >> 没有人接水完成,故继续 >>完成本次接水 time++(time= 2)

第三次>>接水前:{2, 2, 1, 0, 1} >> 接水后:{1, 1, 0, 0, 1} >> 发现第三个人接水完成,故开始向数组的第二部份遍历不为0的元素进行交换 swap(2,3);count--(count=3) >> {1, 1, 1, 0, 0} >> 完成本次接水 time++(time= 3)

第三次>>接水前:{1, 1, 1, 0, 0} >> 接水后:{0, 0, 0, 0, 0} >> 所有人已经完成接水>>count-=3(count=0) >> 完成本次接水 time++(time= 4)

}

输出 4。

下面上代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] powers = new int[n+1];//接水量数组【懵逼了,写了从1开始,无所谓了。。】
        int i = 1;
        while(i<=n && sc.hasNext()){
            powers[i] = sc.nextInt();
            i++;
        }
        int count = n; //接水人数
        int cur = m;//用来存遍历数组第二部分停下的位置。
        int time = 0;//总的接水时间时间
        while(count>0){
            for(int k = 1;k<=m;k++){
                if(powers[k]>0){//接水量大于0
                    if(powers[k]-1==0){//接水量即将为0时 处理接水完成和下一个人的无缝接上操作
                        powers[k]--;
                        count--;
                        //cur
                        for (int j = cur + 1; j < powers.length; j++) {
                            if (powers[j] > 0) {
                                int temp = powers[k];
                                powers[k] = powers[j];
                                powers[j] = temp;
                                cur = j;
                                break;
                            }
                        }
                        continue;
                    }
                    powers[k]--;
                }else if(powers[k] == 0){
                    for(int j = cur + 1;j<powers.length;j++){
                        if(powers[j] > 0){
                            int temp = powers[k];
                            powers[k] = powers[j];
                            powers[j] = temp;
                            cur = j;
                            break;
                        }
                    }
                }
            }
            time += 1;
        }
        System.out.println(time);
    }
}

 

代码有些冗余哈,希望有大神来指导一下~

A掉了哈哈。。

c++接水问题(NOIP2010) 题目描述 学校里有一个水房,水房里一共装有mmm个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1 11。 现在有n n n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 111到n n n编号,ii i号同学的接水量为 wiw_iwi​。接水开始时,11 1到m mm 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j j j完成其接水量要求wj w_jwj​后,下一名排队等候接水的同学 kkk马上接替 jjj 同学的位置开始接水。这个换人的过程是瞬间完成的,且没 阅读详情

相关推荐

贪心算法实战:从排队接水问题看最优调度策略

本文以经典的排队接水问题为例,深入解析贪心算法在任务调度中的应用。通过严谨的数学证明和直观的权重分析,阐述了“让耗时最短的任务优先执行”这一最优调度策略,并提供了C++代码实现。该策略能有效最小化总等待时间,其核心思想可广泛应用于CPU进程调度、服务器请求处理等实际场景。

weixin_29278805的博客 457

1233:接水问题

【题目描述】 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。 现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n编号,i号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的同学k马上接替j同学的位置开始接水。这个换人的过...

C_Dreamy的博客 2556

接水问题呵 .cpp

学生,代码资源,

C++算法之贪心算法

贪心算法是一种求解最优解问题的算法,它的核心思想是每一步都采取当前状态下最优的选择,从而最终得到全局最优解。它是C++重要的一种算法。本文会介绍贪心算法。

现役 OIer。 6765

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题

本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。

weixin_28432777的博客 597

基于ADS1299的8通道脑电采集系统硬件设计实战

生物电信号采集是医疗电子与可穿戴设备中的关键环节,微弱信号的高保真放大与数字化处理直接影响系统性能。高精度模数转换器与低噪声模拟前端设计成为工程实践的核心。ADS1299作为专用生物电测量芯片,集成多通道低噪声放大器与24位Δ-Σ ADC,广泛应用于脑电、心电等生理信号检测。本文基于ADS1299构建8通道脑电采集系统,详细阐述硬件架构、电源与参考设计、输入保护、PCB布局布线、固件SPI配置及数据读取,并结合实测数据分享噪声抑制与调试经验,为EEG采集设备开发提供完整参考。

weixin_29169505的博客 224

接水问题

前言 水法真神奇,暴力出奇迹。欢迎大家又给我的博客阅读量+1。今天嘟嘟老师给大家讲一道含金量较高的题——接水问题。 题目描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。 现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i号同学的接水量为 wi。接

刘嘟嘟的博客 604

高项49个过程,输入、工具技术、输出的思维导图

为了制定项目章程的管理方法主要是采用了数据收集技术,例如通过头脑风暴,通过召集主题专家和团队成员收集信息、解决方案,并在短时间内获得大量创意,并对大量创意进行分析和排序,选出最优化最适合本项目方案,并对项目成员的不同差异观点,进行了引导和对冲突的管理,最终有助于项目干系人的目标、成功标准的内容达成一致意见,形成完善的项目章程。在本过程中得到项目章程,在制定项目章程中需要包括信息有:项目名称、项目目标、项目总里程碑进度表、项目经理、主要干系人及财务预算信息。本过程在仅开展一次,或仅在项目的预定义点开展。

Legend_Jiang的博客 6179

1452.接水问题(思维)

Description 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。 现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj后,下一名...

weixin_30780221的博客 332

手把手教你用DevExpress Patch工具解决VS项目中的试用弹窗问题

本文详细指导开发者使用DevExpress Patch工具解决Visual Studio项目中恼人的试用弹窗问题。核心在于理解并分步处理:首先正确应用补丁工具以绕过运行时验证,然后重点清理或重置项目中的licenses.licx文件以消除编译时验证,从而彻底根治弹窗。

weixin_29234423的博客 588

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

小韦老师@NOIP 普及组-2010-接水问题

小韦老师@NOIP 普及组-2010-接水问题 题目: 描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。 现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj ...

小韦同学的博客 730

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 184

个人理解——蓝桥杯 接水问题

原题信息 资源限制 时间限制:1.0s 内存限制:64.0MB 问题描述   学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打 开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水

highlighters的博客 293

rk3568 rk628桥片 rgb2hdmi

RK628 是瑞芯微全新推出的视频桥接芯片,支持丰富的显示接口,支持高分辨率大屏产品转换需求。基于DRM、FB的显示框架易于使用。 输入信号支持:HDMI、RGB、BT.1120,输出信号支持 HDMI、GVI、Dual LVDS、Dual MIPI、MIPI-CSI、RGB、BT.1120,最高支持4K 60fps 输入/输出转换,并且支持输入到输出 1/4~4倍的缩放。

weixin_35723192的博客 451

QT实现计算器(C/C++)

digitClicked()槽函数用于处理数字按钮的点击事件,operatorClicked()槽函数用于处理运算符按钮的点击事件,equalsClicked()槽函数用于处理等号按钮的点击事件。在operatorClicked()槽函数中,我们获取被点击按钮的文本作为当前运算符,并将文本框中的内容转换为双精度浮点数,存储为操作数1。在上述代码中,我们添加了一个私有成员变量m_operand1,用于存储第一个操作数的值,以及一个私有成员变量m_currentOperator,用于存储当前运算符的值。

CyberNova的博客 385

【蓝桥杯冲冲冲】排队接水--贪心算法巩固 (≧∇≦)

今天继续巩固贪心算法,多思考思路还是很好掌握的,虽然一次性AC有一定难度,需要通盘的考虑和理解,以及扎实的数据结构基础才能独立写出AC代码。不管什么都要坚持吧,三天打鱼两天晒网无法形成肌肉记忆和做题思维,该思考的时候一定不要懈怠,今天就说这么多啦,欢迎评论留言,一起成长:)如果有非计算机专业的uu自学的话,关于数据结构的网课推荐看b站上青岛大学王卓老师的课,讲的很细致,有不懂都可以私信我喔。关于之前蓝桥杯备赛的路线和基本方法、要掌握的知识,之前的博文我都有写,欢迎大家关注我,翻阅自取哦~

Kirara的博客 1460

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

算法训练 接水问题(C语言描述)

算法训练 接水问题(C语言描述) 题目描述 N个人要打水,有M个水龙头,第i个人打水所需时间为Ti,请安排一个合理的方案使得所有人的等待时间之和尽量小。 提示 一种最佳打水方案是,将N个人按照Ti从小到大的顺序依次分配到M个龙头打水。 例如样例中,Ti从小到大排序为1,2,3,4,5,6,7,将他们依次分配到3个龙头,则去龙头一打水的为1,4,7;去龙头二打水的为2,5;去第三个龙头打水的为3,6...

LuMengSheng126的博客 2021

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

2010NOIP普及组真题 2. 接水问题

一本通:http://ybt.ssoier.cn:8088/problem_show.php?4、如果某个水龙头的剩余时间 b[i] 减到了0,但是队伍中已经没有排队等待接水的人了(j>n),则设置。1、先给每个b[i]水龙头分配一个人a[i],b[i] 表示水龙头的剩余时间。,此时的接水时间 t 就是最终结果。现实生活中如果我们去打水,肯定看。3、如果某个水龙头的剩余时间。同时 j++ 指向下一个人。5、当关闭水龙头的数量。循环表示1秒,即接水。2、n个人就处理n次。

weixin_40252159的博客 1223

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

洛谷P1190 接水问题

此题源于洛谷P1190 链接奉上qwq:P1190

秃头交易站. 631

洛谷P1223 排队接水

洛谷P1223 排队接水

weixin_43708800的博客 1402

【算法小讲堂】#1 贪心算法

算法小讲堂 | #1 贪心算法

cheer2333的博客 3978

洛谷 P1190 接水问题(简单模拟)

题目链接:https://www.luogu.org/problemnew/show/P1190 思路: 1.用a[n]保存这些人的接水量,用s[m]保存这些水龙头需要出水的量,先把a[n]中0到m-1赋到s[m]中。 2.每次循环找到现在接水的最小值,把a[n]中下一个赋给它,例如s[m]现在是4、4、2,a[n]是4、4、2、1,那就把1即‘a[3]’赋到2即‘s[2]’上。 3.最后...

elorole的博客 958

[luogu p1223] 排队接水

题面 传送门 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。 输入格式 输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。 输出格式 输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输...

crab_xbc的博客 346

P1223 排队接水

贪心入门

qq_50730327的博客 896

洛谷P1223排队接水

题目描述 有 n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti​,请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。 输入格式 第一行为一个整数 n。 第二行 n 个整数,第 i 个整数Ti​ 表示第 i 个人的等待时间 Ti​。 输出格式 输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。 输入输出样例 输入 10 56 12 1 99 1000 234 33 55 99 812

Solaku7的博客 2805
上一篇: 【Git】关于Idea中Push项目到Github中遇到的问题。
下一篇: 【算法】纸牌三角形问题的穷举解决方法及其限界优化
Luoseaspring
博客等级 码龄10年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值