最大不能组合的数

题目描述:

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

    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数

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

再例如:
用户输入:
3 5
程序应该输出:

7

解题思路:假设输入数字为a,b(a<b),则可以发现,由a和b产生的数字序列,若存在由n开始的a个连续的数,n、n+1、……、n+a-1,则可以得到最大不能组合的数字为n-1,因为后边的所有的数都可以由n+a,n+1+a,…………,n+a-1+a,迭代产生,因此只需要求出n即可。

要产生a和b生成的数字序列,请移步:(google笔试题,丑数)http://blog.csdn.net/keynumber/article/details/8742676


#include <iostream>
#include <queue>
using namespace std;
int a[1000000];
int main()
{
    int n, m, num, pm, pn, p;
    cin>>m>>n;
    if(m>n)swap(m, n);

    a[0]=m, a[1]=n;
    pm = pn = 0;
    p=2, num=1;
    if(m+1==n)
        num=2;

    while(num<m)
    {
        if(a[pm]+m>a[pn]+n)
            a[p] = a[pn] + n;
        else
            a[p] = a[pm] + m;

        if(a[pm]+m == a[p])
            pm++;
        if(a[pn]+n == a[p])
            pn++;
        if(a[p]==a[p-1]+1)
            num++;
        else
            num=1;

        p++;
    }

    cout<<p<<endl;

    cout<<a[p-m]-1<<endl;

    return 0;
}



你可能感兴趣的:(最大不能组合的数)