买不到的数目[蓝桥杯]

简介: 小明开了一家糖果店。他别出心裁:把水果糖包成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;
}


相关文章
|
8月前
|
存储 人工智能 算法
三维数组解决问题案例(天梯赛座位分配)
三维数组解决问题案例(天梯赛座位分配)
110 0
|
8月前
|
Java
leetcode-452:用最少数量的箭引爆气球
leetcode-452:用最少数量的箭引爆气球
81 0
|
3月前
|
测试技术 定位技术 C++
第十四届省赛大学B组(C/C++)岛屿个数
第十四届省赛大学B组(C/C++)岛屿个数
|
7月前
|
存储 算法 测试技术
力扣经典150题第五十题:用最少数量的箭引爆气球
力扣经典150题第五十题:用最少数量的箭引爆气球
40 0
|
7月前
|
搜索推荐 算法 C++
蓝桥杯分糖果、最小化战斗力差距、小蓝零花钱
这是一个关于算法问题的集合,包括三个不同的任务: 1. **分糖果**:肖恩有不同种类的糖果要分给学生,目标是使得到糖果字符串的字典序最大且尽量小。给定糖果种类数和一个初始字符串,输出能达到的最小字典序的最大值。 2. **最小化战斗力差距**:小蓝需要将队员分为两组,每组战斗力差距最小。给定队员数量和战斗力值,找出最小的战斗力差距。 3. **小蓝的零花钱**:小蓝要在序列中分割偶数和奇数,每次分割代价是两端元素差的绝对值。目标是在预算内确定最多能进行多少次这样的分割。 每个问题都提供了输入输出示例和相应的C++代码片段来解决这些问题。
|
8月前
|
算法 测试技术
联想算法题-小朋友分糖果
联想算法题-小朋友分糖果
50 0
|
8月前
|
算法 Java C++
买不到的数目
买不到的数目
44 0
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
73 0
|
机器人 Java Python
leetcode每日一题.200:岛屿数量
leetcode每日一题.200:岛屿数量
85 0
leetcode 452用最少数量的箭引爆气球
leetcode 452用最少数量的箭引爆气球
94 0
leetcode 452用最少数量的箭引爆气球