蓝桥杯—[第四届]买不到的数目【A组】

资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
—————————————————————————————————————————
小明开了一家糖果店。

他别出心裁:把水果糖包成4颗一包和7颗一包的两种。

糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。

当然有些糖果数目是无法组合出来的,比如要买10颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。

大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
—————————————————————————————————————————
输入格式
两个正整数n,m,表示每种包装中糖的颗数。

输出格式
一个正整数,表示最大不能买到的糖数。


数据范围
2≤n,m≤1000,
保证数据一定有解。
​—————————————————————————————————————————

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

用户输入:
3 5
程序应该输出:
7
—————————————————————————————————————————
资源约定:
峰值内存消耗<64M
CPU消耗<3000ms

根据题目,我们可以分析 xn + ym = ?,题目要求的是,不能用xn + ym来表示的最大的数是什么,目前想到的就是暴力搜索,两层循环,将a[xn+ym] = 1进行标记,表示可以用xn + ym 来表示。当我们遍历a时,当a[i] == 0,就表示不能用xn+ym。那么最大的那个i就是我们想要求的数,考虑到数据会爆掉。因此采用打表法来找规律得最终结果。

先根据题目写出一个能运行小部分数据的程序:(特别注意的是,有解的情况下,那么n和m一定是互质的)

#include<stdio.h>
intmain()
{
    longinta[100000];
    intp ,q;
    scanf("%d%d",&p,&q);
    for(intx=0; x<=1000;x++)
    {
        for(inty=0; y<=1000;y++)
        {
            a[x*p+y*q] =1;
        } 
    }
    intmax=0;
    for(inti=0; i<1000;i++)
        if(a[i] ==0)
        {
            max=i;
        }
    printf("%d",max); 
    return0;
}

然后输入数据寻找规律

m

n

x

m

x

3

5

7

4

3

5

3

7

11

4

5

11

3

8

13

4

7

17

开始找规律:

m = 3 时,n每增加1,那么x就增加2。考虑2倍关系,发现x = 2n-3

m = 4 时, n每增加2, 那么x就增加6。考虑3倍关系,发现x = 3n-4

再观察一下m和n和x三者之间的关系,发现 x = (m-1)n - m

因此可以写出以下程序:完美通关

#include<stdio.h>
intmain()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d",(m-1)*n-m); 
    return0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值