蓝桥杯练习系统历届试题 买不到的数目

问题描述

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

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

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

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

输入格式

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

输出格式

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

样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
 
思路:

据说是一个很水的题。可能是据大腿说吧。
已知a, b,求ax+by不可能组成的数的最大值。于是我转而求ax+by能组成的连续的数的最小值。
据上图,于是我需要找能使ax+by稳定+1时x和y满足的条件。于是我通过求ax-by = 1,(y减小 x增大)求出x满足的最小值x1,然后通过求by - ax = 1
(y增大,x减小)求出最小值y1,然后这组解说明只有当x>=x1 或者 y>=y1的时候原式才能稳定+1。所以a*(x1-1) + b*(y1-1) 就是能组成的连续数列的最小值。
减1即为不能组成的数的最大值。

以上是大腿的思路。

然后。看看看。

大腿为什么那里会说错呢。就是我认为的,+1和-1的问题。

真心不是故意刷屏的呢,终于理解了大腿的脑洞感觉好开心。

T_T 真希望自己有大腿那么机智的脑袋~~~

/*
 据说是一个很水的题。可能是据大腿说吧。
 已知a, b,求ax+by不可能组成的数的最大值。于是我转而求ax+by能组成的连续的数的最小值。
 据上图,于是我需要找能使ax+by稳定+1时x和y满足的条件。于是我通过求ax-by = 1,(y减小 x增大)求出x满足的最小值x1,然后通过求by - ax = 1
 (y增大,x减小)求出最小值y1,然后这组解说明只有当x>=x1 或者 y>=y1的时候原式才能稳定+1。所以a*(x1-1) + b*(y1-1) 就是能组成的连续数列的最小值。
 减1即为不能组成的数的最大值。
 */

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

int get(int a, int b) {
    for (int i=0; ; ++i) {
        if ((b*i + 1) % a == 0) {
             //cout << i << "==" << (b*i+1)/a << endl;
             return (b*i+1)/a ;
        }
    }
}

int main() {
    int a, b;
    while(cin >> a >> b) {
        int x = get(a, b);
        int y = get(b, a);

       // cout << x << " " << y << endl;
        int ans = a*(x-1) + b*(y-1) - 1;
        cout << ans << endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/icode-girl/p/5264954.html