题目描述:
小明开了一家糖果店。他别出心裁:把水果糖包成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.youkuaiyun.com/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;
}