`

蓝桥杯-买不到的数目

阅读更多

本文转载自:http://blog.csdn.net/keepthinking_/article/details/9262825

 

标题:买不到的数目

    小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出:
一个正整数,表示最大不能买到的糖数

不需要考虑无解的情况

例如:
用户输入:
4 7
程序应该输出:
17

再例如:
用户输入:
3 5
程序应该输出:

7

分析:

这道题的一般解法不难想到,这两天刚好学习了扩展的欧几里得算法,所以觉得这道题可以借助该算法来提高性能,因为刚接触该算法一知半解,经过艰苦的测试,初步得到了一种解法,不过不敢保证一定正确,所以贴出来,如果哪位发现有错,请麻烦告知一声,我好修改或者删掉代码。

首先理论依据来自该篇文章:http://www.cppblog.com/yuanyuelang/articles/95378.html

该文章中有这样一个等式:a(x+qb)+b(y-qa)=c; q为任意整数

在代码中,m对应这里的a,n对应这里的b

从该等式中,我们可以得到:x+qb>=0 ; y-qa>=0  (1)

其中,x=(c/d)*x‘  y=(c/d)*y' 

其中d=1,所以x=c*x' ,y=c*y'

对于x'和y'可以通过扩展的欧几里得算法求得,

则 式子(1)可以转换成:

c*x'+qb>=0; (2)

c*y'-qa>=0; (3)

满足以上两个式子,未知变量有c和q,验算了好久,还是不能在这里进一步直接得到c的值,所以暂时只能退而一个一个验证c是否满足条件了,

如果y‘>0,那么x'一定<0,结合(2)(3),(将a替换成m,b替换成n)

可以得到:

-m*x'*q<=|x'*y'*c|<=n*y'*q  (4)

到了这里就可以直接测试c的取值了,当c取什么值,使得q无解(q是整数)

如 m=3,n=4 (x‘=-1,y’=1)

根据(4)有:

3q<=c<=4q  (这里如果能够直接得出c的值就不用去测试了,但是暂时想不到怎么直接得出c的值)

当c取什么值,使得q无解,c从m*n开始向下递减,

当c=12,11,10,9,8,7,6,的时候,q都有解

当c=5的时候,q是无解的

所以c=5是对应的答案

以上是y‘>0的情况,如果y'<0,则对应的(4)式为:

-n*y'*q<=|x'*y'*c|<=m*x'*q (5)

如:m=4,n=7 (x'=2,y'=-1)

根据(5)式有:

7q<=2c<=8q

当c=28~18 ,q都有解

当c=17 ,q无解

所以c=17为结果

以下就是对应的java代码:

 

[java] view plaincopy
 
  1. import java.util.Scanner;  
  2.   
  3. public class ys_cbk_08 {  
  4.     // 使用扩展的欧几里得算法  
  5.     public static void main(String[] args) {  
  6.         Scanner scanner = new Scanner(System.in);  
  7.         // 如果两个数的最大公约数不是1,则无解  
  8.         int m = scanner.nextInt(), n = scanner.nextInt();  
  9.         // 1.求满足m*x+n*y=gcd(m,n)等式的x,y的解  
  10.         // 求最大公约数,同时求,x,y的值  
  11.         int gcd = gcd(m, n);  
  12.         if (gcd != 1) {  
  13.             System.out.println("无解");  
  14.             return;  
  15.         }  
  16.         if (y < 0) {//这里的y对应分析中的y’  
  17.             int a = -n * y;  
  18.             int b = m * x;  
  19.             int c = 0;  
  20.             for (int i = n * m; i >= 1; i--) {  
  21.                 c = -x * y * i; //测试c  
  22.                 if ((c / a) * b < c) {  
  23.                     System.out.println(i);  
  24.                     break;  
  25.                 }  
  26.             }  
  27.         } else {  
  28.             int a = -m * x;  
  29.             int b = n * y;  
  30.             int c = 0;  
  31.             for (int i = n * m; i >= 1; i--) {  
  32.                 c = -x * y * i;  
  33.                 if ((c / a) * b < c) {  
  34.                     System.out.println(i);  
  35.                     break;  
  36.                 }  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41.     private static int x;  
  42.     private static int y;  
  43.     /** 
  44.      * 使用扩展欧几里得算法求最大公约数及其对应的x,y值 
  45.      * @param m 
  46.      * @param n 
  47.      * @return 
  48.      */  
  49.     public static int gcd(int m, int n) {  
  50.         // 方法1,递归  
  51.         // if(n==0){  
  52.         // x=1;  
  53.         // y=0;  
  54.         // return m;  
  55.         // }  
  56.         // int d=gcd(n,m%n);  
  57.         // int tmp=x;  
  58.         // x=y;  
  59.         // y=tmp-m/n*y;  
  60.         // return d;  
  61.   
  62.         // 引用:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html  
  63.         // 方法2,非递归  
  64.         int x1, y1, x0, y0;  
  65.         x0 = 1;  
  66.         y0 = 0;  
  67.         x1 = 0;  
  68.         y1 = 1;  
  69.         x = 0;  
  70.         y = 1;  
  71.         int r = m % n;  
  72.         int q = (m - r) / n;  
  73.         while (r != 0) {  
  74.             x = x0 - q * x1;  
  75.             y = y0 - q * y1;  
  76.             x0 = x1;  
  77.             y0 = y1;  
  78.             x1 = x;  
  79.             y1 = y;  
  80.             m = n;  
  81.             n = r;  
  82.             r = m % n;  
  83.             q = (m - r) / n;  
  84.         }  
  85.         return n;  
  86.     }  
  87. }  


输入:

 

22 23

输出:

461

分享到:
评论

相关推荐

    蓝桥杯国赛题之C++买不到的数目.zip

    【标题】:“蓝桥杯国赛题之C++买不到的数目” 这道题目来源于“蓝桥杯”全国软件和信息技术专业人才大赛,一个在中国颇具影响力的编程竞赛。参赛者需要使用C++编程语言来解决这个问题。题目核心在于理解和解决算法...

    2016第七届蓝桥杯大赛CC--大学C组省赛真题详解.doc

    - **问题描述**:给定一个正方形网格,其中某些格子被标记为特殊格子,要求在不经过特殊格子的情况下,找到所有由四个相邻格子组成的正方形,并输出其个数。 - **解题思路**: - 构建二维数组存储网格信息,遍历...

    买不到的数目.zip

    "买不到的数目.zip"这个压缩包文件的内容主要与程序设计和算法相关,特别是与"蓝桥杯"竞赛相关的题目和解答。蓝桥杯是一项针对在校大学生举办的程序设计竞赛,旨在提升学生的算法思维和编程能力。参与这项比赛,学生...

    第七届蓝桥杯省赛B组试题

    #### 知识点1:煤球数目 本题属于数学计算类题目,主要考察等差数列的求和公式及其应用。 **题意简述:** 题目描述了一种特殊的煤球堆放方式:形成一个三角棱锥形,每层煤球的数量构成一个等差数列。第1层放1个煤球...

    蓝桥杯软件大赛历届试题及答案

    买不到的数目 8 大臣的旅费 9 幸运数 11 横向打印二叉树 12 危险系数 13 网络寻路 15 高僧斗法 16 格子刷油漆 17 农场阳光 18 约数倍数选卡片 18 九宫重排 19 公式求值 22 回文数字 24 国王的烦恼 25 数字游戏 27 ...

    蓝桥杯算法辅导.zip

    蓝桥杯算法辅导 ,算法作为蓝桥杯竞赛的一个核心...买不到的数目 不定方程解法 高僧斗法 素数筛法 整数的基本性质与应用 浮点数的注意事项 经典的递归问题 递归与循环 代码使用java编写,包含了AVL树的模型图作为参考,

    第十二届蓝桥杯大赛模拟赛(第三期).pdf

    然而,考虑到蓝桥杯竞赛的一般性质和以往比赛的题目类型,我们可以推测可能涉及到的IT知识点,这包括但不限于编程语言(如C、C++、Java、Python等)、算法设计、数据结构、计算机网络、操作系统原理、数据库原理等。...

    蓝桥杯Java

    一个简化模型是虫口数目模型,即虫口数的动态变化可以用简单的迭代公式来描述。这个模型揭示了系统参数(如环境参数r)对系统行为(如虫口数的稳定性、周期性或混沌状态)的影响。 3. 镜像串与代码填空:镜像串是指...

    第十五届蓝桥杯大赛软件赛省赛第二场C/C++ 大学A B C组试题

    ### 第十五届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组试题解析 #### 题目背景及要求概述 蓝桥杯大赛是中国一项知名的计算机类竞赛,旨在选拔和培养优秀的计算机人才。本次比赛为第十五届蓝桥杯大赛软件赛省赛第...

    2014第五届蓝桥杯JAVA本科B组试题及答案

    他意识到书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。小明只想练习该书的第81页到第92页的武功,又不想带着整本书。因此,我们需要计算小明至少要撕下多少张纸带走。 解决这个问题需要我们...

    山东省第六届蓝桥杯C++B组题目

    ### 山东省第六届蓝桥杯C++B组题目解析 #### 一、奖券数目 **题目背景:** 在某抽奖活动中,主办方为了迎合大众的...以上就是针对山东省第六届蓝桥杯C++B组题目的详细解析,希望能帮助到正在准备类似比赛的同学们。

    第十三届蓝桥杯大赛软件赛决赛_JG java 研究生组

    为了解决这个问题,我们需要计算出每个数字字符需要的火柴棒的数目,然后计算出小蓝能拼出的最大整数。这个问题可以使用动态规划来解决。 试题 B:排列距离 这也是一道结果填空的题,要求选手计算出小蓝需要多少次...

    蓝桥杯真题解析

    "蓝桥杯真题解析" 在本节中,我们将对蓝桥杯真题进行解析,涵盖了多个领域的算法和技术。 首先,让我们从微生物增殖问题开始。假设有两种微生物 X 和 Y,X 出生后每隔 3 分钟分裂一次(数目加倍),Y 出生后每隔 2...

    蓝桥杯第七届省赛(Java语言A组)试题解答.pdf

    通过对这些题目的分析,我们可以看出,蓝桥杯竞赛不仅仅是对编程语言掌握程度的检验,更是对数据结构与算法知识运用能力的考验。对于参赛者来说,扎实的数据结构与算法基础是取得好成绩的关键。

    2016年蓝桥杯c~c++省赛试题(卷)与答案.docx

    这道题需要找到所有可能的数位组合,使得BDEFA + --- + ------- = 10GHIC成立,其中A到I代表1到9的数字,且每个字母不重复。解决方法是使用深度优先搜索(DFS)遍历所有可能的数字组合。题目中给出的代码正是使用DFS...

    蓝桥杯cc省赛试题及答案解析.docx

    题目要求使用1到9的数字,每个数字不重复地组成一个等式,使得算式的值等于10。例如,6+8/3+952/714 和 5+3/1+972/486 都是合法的解。解题思路是采用深度优先搜索(DFS)的方法,遍历所有可能的数字组合,判断是否...

    蓝桥历年省赛真题

    问题要求计算在不使用带有数字"4"的5位数作为抽奖号码时,能发出的奖券最大数目。这一问题涉及到数值范围、排除特定数字的算法以及基本的计算。 ### 知识点二:星系炸弹爆炸时间计算 题目给出一个特定的星系炸弹...

    编程比赛三大赛制介绍(ACM赛制、OI赛制、IOI赛制)-2021.03.04.pdf

    与ACM赛制类似,选手提交题目后会获得反馈,包括“通过”、“运行错误”、“答案错误”等,但同样看不到错误的测试样例。每道题目由多个测试点组成,根据通过的测试点数量获得相应的分数。提交次数不限,但错误提交...

    Java实现蓝桥杯凑算式(全排列)

    在`for`循环中,我们遍历1到9的所有数字,如果该数字不在`list`中,就将其添加到列表末尾,然后递归调用`f()`,之后再将添加的数字移除,以便回溯到上一层的排列。 整个程序通过递归实现全排列,对于每个排列,它...

    2​0​1​6​年​第​七​届​蓝​桥​杯​B组试题及答案参考

    在第七届蓝桥杯B组的试题中,涉及到了计算机编程的不同方面知识点,下面逐一解析: 1. 煤球数目问题 这道题目要求求出堆成三角棱锥形的煤球总数目。第一层放1个,第二层放3个,第三层放6个,第四层放10个,依此类推...

Global site tag (gtag.js) - Google Analytics