买不到的数目[蓝桥杯]

简介: 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

题目链接:买不到的数目

时间限制: 1 Sec 内存限制: 256 MB


题目描述:

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

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

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

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

输入:

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

输入保证两个正整数互质

输出:

一个正整数,表示最大不能买到的糖数


样例输入:

4 7

样例输出:

17


题意:找一个最大的不能组合出来的数字。

思路:几乎暴力,因为数据范围不大,那我们就逐个标记。


因为题中数据说两个数都不大于1000,那我们把数组p定义成1000000那么大,然后从头开始标记。


p[i]=1表示能组合出 i 这个数

p[i]=0表示不能组合出 i 这个数


我们假设两种包装数量分别是 a,b 假如一个数 i 可以被组合出来,那么 i+a ,i+b 是不是也可以被组合出来,就按这种思路从小到大标记,然后我们从大到小遍历,如果p[i]==0(我们是倒着遍历,所以第一个p[i]==0的数就是最大的不能被组合出来的数)那我们就输出就行了。


1.gif


看代码:


#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
int p[maxn+1]={0};
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        //cout<<a*b-a-b<<endl;
        memset(p,0,sizeof(p)); // 每次初始化一下
        p[0]=1; 
        for(int i=1;i<=maxn;i++)
        {
            if(i>=a&&p[i-a])
                p[i]=1;
            else if(i>=b&&p[i-b])
                p[i]=1;
        }
        for(int i=maxn;i>=1;i--)
        {
            if(!p[i])
            {
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

细心的的小可爱是不是看到了我那行注释的代码,那么恭喜你发现了这题的究极解法,没错就是只写那一条语句就行了。

至于这个解法就是数论了我就不多解释了,感兴趣的小可爱可以尝试证明一下。


究极代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        cout<<a*b-a-b<<endl;
    }
    return 0;
}


相关文章
|
4月前
|
搜索推荐 算法 C++
蓝桥杯分糖果、最小化战斗力差距、小蓝零花钱
这是一个关于算法问题的集合,包括三个不同的任务: 1. **分糖果**:肖恩有不同种类的糖果要分给学生,目标是使得到糖果字符串的字典序最大且尽量小。给定糖果种类数和一个初始字符串,输出能达到的最小字典序的最大值。 2. **最小化战斗力差距**:小蓝需要将队员分为两组,每组战斗力差距最小。给定队员数量和战斗力值,找出最小的战斗力差距。 3. **小蓝的零花钱**:小蓝要在序列中分割偶数和奇数,每次分割代价是两端元素差的绝对值。目标是在预算内确定最多能进行多少次这样的分割。 每个问题都提供了输入输出示例和相应的C++代码片段来解决这些问题。
|
数据采集 数据挖掘 Python
【每周一坑】阿姆斯特朗数
提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
|
5月前
|
算法 Java C++
买不到的数目
买不到的数目
33 0
|
11月前
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
61 0
【每日一道智力题】之海盗分金币(上)
【每日一道智力题】之海盗分金币(上)
239 0
【每日一道智力题】之如何最快的找到最轻的砝码
【每日一道智力题】之如何最快的找到最轻的砝码
178 0
(数论)蓝桥杯AcWing 1205. 买不到的数目
(数论)蓝桥杯AcWing 1205. 买不到的数目
45 0
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
|
算法 C语言
假币问题:有n枚硬币,其中有一枚是假币,已知假币的重量较轻。现只有一个天平,要求用尽量少的比较次数找出这枚假币。
(2)当n为奇数时,将前后两部分,即1…n,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币;若两端重量相等,则中间的硬币,即第 (n+1)/2枚硬币是假币。n,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币;假币问题:有n枚硬币,其中有一枚是假币,已知假币的重量较轻。:因为30位偶数,所以至少要被分一次,然后成为奇数之后,那个假币就是奇数的中位数,所以只需要2次。若输入的硬币数为30,则最少的比较次数为(2),最多的比价次数为(4)。
497 0