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

相关文章

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核