`

蓝桥杯-买不到的数目

阅读更多

本文转载自: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年度蓝桥杯c-c地区赛试题及答案解析.docx

    2016年度蓝桥杯C-C++地区赛,作为计算机专业领域中一项备受瞩目的竞赛,不仅考查选手的编程技巧和逻辑思维,更着重于对算法思想和数据结构的深入理解。本次竞赛的试题与答案解析,为我们提供了一次极佳的学习和研究...

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

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

    买不到的数目.zip

    在“买不到的数目.zip”压缩包中,我们能够发现各种与蓝桥杯竞赛相关的文件,它们按照题目编号有序排列。输入文件(如“1.in”、“2.in”、“3.in”)和输出文件(如“1.out”、“2.out”、“3.out”)是进行竞赛...

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

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

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

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

    蓝桥杯算法辅导.zip

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

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

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

    2016第七届蓝桥杯CC++-B组题解.docx

    2016年第七届蓝桥杯CC++-B组的赛事是一场集中展示算法和编程能力的竞赛,参赛者们不仅需要具备扎实的编程基础,还要对算法和数据结构有深入的理解。本文将对第七届蓝桥杯CC++-B组题目的题解进行详细阐述,以便帮助更...

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

Global site tag (gtag.js) - Google Analytics