JD 1147:Jugs(一种用最少步骤求解的方法)

2024-09-07 03:18

本文主要是介绍JD 1147:Jugs(一种用最少步骤求解的方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OJ题目:click here~~

题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。

输入的三个数:a,b,n;
> 由题不定方程ax+by=n必定有解
> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2<0,b2>0,a2是满足条件的最大负整数;
> (i)  如果|a1|+|b1|<|a2|+|b2|-1,则fill A a1次,每次fill A后,pour到B,如果B满则empty B,再将A中剩下的pour到B,这样empty B |b1|次以后,即可得解;(因为a*a1+b*b1=n)
> (ii)如果|a1|+|b1|>=|a2|+|b2|-1,则fill B b2次,每次fill B后,pour到A,如果A满则empty A,再将B中剩下的pour到A,这样经过empty A |a2|-1次以后,再将A装滿,B中剩下的就是n了;
> 
> Sample Input
> 
> 3 5 4 
> 5 7 3 
> 3x+5y=4的两组解为(2,-1),(-2,2)
> 2+1=1+2;
> 用方法II:(fill B两次,empty A 一次)
> fill B (第一次fill B)
> pour B A 
> empty A (A 滿清空A)(这里只需要清一次A,因为a2=-1)
> pour B A (B中剩下的到A)
> fill B (第二次fill B)
> pour B A (装滿 A,B中剩下的即为n)
> success 
> 
> 5x+7y=3的两组解为(2,-1)(-5,4)
> 2+1<5+4
> 用方法I:(fill A 两次empty B 一次)
> fill A (第一次fill A)
> pour A B 
> fill A (第二次fill A)
> pour A B 
> empty B 
> pour A B 
> success 

int main(){//freopen("in.txt","r",stdin) ;int i , j , n , A , B ;while(cin >> A >> B >> n){int a1 , b1 , a2 , b2 , a , b , t ;int x , y ;for(i = 1; ;i++){y = n - A*i ;if(y%B == 0 && y < 0){a1 = i ;b1 = y/B ;break ;}}for(i = -1; ;i--){y = n - A*i ;if(y%B == 0 && y > 0){a2 = i ;b2 = y/B ;break ;}}a = b = 0 ;if(abs(a1) + abs(b1) < abs(a2) + abs(b2) - 1){t = abs(b1) ;for(i = 0;i < a1;i++){puts("fill A") ;a = A ;puts("pour A B") ;if(!t) break ;if(a + b >= B){puts("empty B") ;puts("pour A B") ;t-- ;a = a + b - B ;b = 0 ;b = a ;a = 0 ;}else{b = a + b ;a = 0 ;}}}else{t = abs(a2) - 1 ;for(i = 0;i < b2;i++){puts("fill B") ;b = B ;puts("pour B A") ;if(!t) break ;if(a + b >= A){puts("empty A") ;puts("pour B A") ;t-- ;b = a + b - A ;a = 0 ;a = b ;b = 0 ;}else{a = a + b ;b = 0 ;}}}puts("success") ;}return 0 ;
}



这篇关于JD 1147:Jugs(一种用最少步骤求解的方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143905

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据