基础算法练习200题09、水池注水

简介: 基础算法练习200题09、水池注水

题目:

甲乙两个水管单独开,注满一池水,分别需要20小时,16小时。丙水管单独开,排一池水要10小时,若水池没水,同时打开甲乙两水管,5小时后,再打开排水管丙,问水池注满还需要多少小时?


题解:

甲功率=1/20(进水)


乙功率=1/16(进水)


丙功率=1/10(排水)


通分一下:


一眼就看出来公分母是80。甲是4/80,乙是5/80,丙是8/80


可以看出,甲乙之和是9/80与丙8/80进行计算。


题目说是先开甲乙5小时,也就是,(9/80)*5,咱们不依然使用80这个分母等于45/80。


只需要计算出剩余的35是如何填充的即可。


已知甲乙之和与丙比较多出1/80。


故而,开启甲乙5小时后打开丙排水,需要时间35小时即可。


编码分析1:

我这里不使用欧几里得定理,咱们一步步分析。


没有通分,使用浮点数记性计算,最终出现浮点数计算错误,无法精准答案。


image.png


由于答案肯定是整数,所以最后取整即可。


package com.item.action;
/**
 * 
 * @author hongmuxiangxun 红目香薰 付文龙 老师付 laoshifu
 *
 */
public class demo9 {
  public static void main(String[] args) {
  double a=20;
  double b=16;
  double c=10;
  double five=(1/a+1/b)*5;
  double last=(1/a+1/b-1/c);
  double result=(1-five)/last;
  System.out.println(String.format("%.0f", result));
  }
}

image.png



编码分析2:(算法升级,难度提升到40题附近,可以先略过,后面也会有对欧几里得定理的具体拆分式讲解)

这个题需要一定的数学基础,起码会通分。


样例:


image.png


最小公分母=2*5*3*2*1*5=300


那么,20与16页一样

image.png



也可以:


20=2*2*5


16=2*2*2*2


都是质因数,那个数量多选按个,相乘即可。


最小公倍数=2*2*2*2*5=80


这里套用欧几里得定理直接出结果:


package com.item.action;
/**
 * 
 * @author hongmuxiangxun 红目香薰 付文龙 老师付 laoshifu
 *
 */
public class demo9_1 {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println("最大公约数:"+gcd(2, 16));
  System.out.println("最小公倍数:"+lcm(20, 16));
  }
  /**
  * 
  * 最大公约数
  * @param x
  * @param y
  * @return
  */
  public static int gcd(int x, int y) {
  if (y == 0) {
    return x;
  }
  return gcd(y,x%y);
  }
  /**
  * 最小公倍数·此写法对于比较大的数处理较好
  * @param x
  * @param y
  * @return
  */
  public static int lcm(int x, int y) {
  int gcd = gcd(x, y);
  return (x / gcd) * (y / gcd) * gcd;
  }
}

image.png



取整计算可以消除浮点数运算丢失精度的问题:


package com.item.action;
/**
 * 
 * @author hongmuxiangxun 红目香薰 付文龙 老师付 laoshifu
 *
 */
public class demo9_1 {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  //通分后的最小公倍数就可以当做水池的总单位:lcm
  int lcm = lcm(20, 16);
  //计算前5小时总水量
  int five=(lcm/20+lcm/16)*5;
  //剩余水池空间lcm-five
  int last=lcm-five;
  //计算5小时后的功率
  int power=lcm/20+lcm/16-lcm/10;
  //剩余空间/功率=最后消耗时间
  int result=last/power;
  System.out.println(result);
  }
  /**
  * 
  * 最大公约数
  * @param x
  * @param y
  * @return
  */
  public static int gcd(int x, int y) {
  if (y == 0) {
    return x;
  }
  return gcd(y,x%y);
  }
  /**
  * 最小公倍数·此写法对于比较大的数处理较好
  * @param x
  * @param y
  * @return
  */
  public static int lcm(int x, int y) {
  int gcd = gcd(x, y);
  return (x / gcd) * (y / gcd) * gcd;
  }
}

image.png

相关文章
|
4月前
|
前端开发 测试技术 API
一文掌握软件分支管理
本文详细介绍了软件分支管理的实践经验,结合具体项目案例,从版本号、分支命名、标签管理到合并策略等方面展开。通过清晰的规则和流程图示,帮助团队避免版本混乱,提升研发效率。强调主干与开发分支的核心作用,同时提醒合理控制分支数量,确保协作顺畅。适用于不同类型的项目,助力团队建立适合自身的版本管理体系。
696 69
一文掌握软件分支管理
|
8月前
|
人工智能 负载均衡 数据可视化
Deepseek太卡,白嫖阿里云Deepseek-R1满血版,免费100万Token
阿里云推出DeepSeek-R1 671B满血版免费部署方案,解决服务器繁忙问题。通过百炼大模型平台,用户可获得100万免费Token,无需编码,最快5分钟完成部署。支持自动弹性扩展,提供API调用和Chatbox客户端配置,轻松实现DeepSeek自由。新手零基础也能快速上手,最低0元体验高性能AI模型。
|
8月前
|
机器学习/深度学习 人工智能 JavaScript
video-subtitle-master:开源字幕生成神器!批量生成+AI翻译全自动,5分钟解放双手
video-subtitle-master 是一款开源AI字幕生成工具,支持批量为视频或音频生成字幕,并可将字幕翻译成多种语言。它集成了多种翻译服务和语音识别技术,适合视频创作者、教育领域和个人娱乐使用。
846 0
video-subtitle-master:开源字幕生成神器!批量生成+AI翻译全自动,5分钟解放双手
|
网络协议 物联网 虚拟化
|
12月前
|
传感器 存储 编解码
基于STM32的智能手环wifi连接手机APP(上)
基于STM32的智能手环wifi连接手机APP(上)
461 0
|
JSON Go 数据格式
Go slog 包:开启结构化日志的奇妙之旅
本文对 go 语言里的 slog 包进行了详细介绍,包括基本的使用、Logger 实例的创建和高效输出日志以及自定义日志信息等内容。
697 0
|
机器学习/深度学习 并行计算 PyTorch
PyTorch与CUDA:加速深度学习模型训练的最佳实践
【8月更文第27天】随着深度学习应用的广泛普及,高效利用GPU硬件成为提升模型训练速度的关键。PyTorch 是一个强大的深度学习框架,它支持动态计算图,易于使用且高度灵活。CUDA (Compute Unified Device Architecture) 则是 NVIDIA 开发的一种并行计算平台和编程模型,允许开发者直接访问 GPU 的并行计算能力。本文将详细介绍如何利用 PyTorch 与 CUDA 的集成来加速深度学习模型的训练过程,并提供具体的代码示例。
1232 1
|
人工智能 编解码 算法
AIGC下一步:用AI再度重构或优化媒体处理
LiveVideoStackCon2023深圳站,阿里云视频云演讲分享
531 1
|
存储 数据库 双11
数据库的三大范式及其重要性,详细易懂
数据库的三大范式及其重要性,详细易懂
2201 0
|
关系型数据库 MySQL Linux
linux环境下查看mysql服务状态和重启命令
linux环境下查看mysql服务状态和重启命令
951 0