第八题
标题:买不到的数目
题目描述:
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出
一个正整数,表示最大不能买到的糖数
样例输入
4 7
样例输出
17
样例输入
3 5
样例输出
7
资源约定:
峰值内存消耗 <64M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
解题思路:
假设我们输入数字为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是我们输入的糖的个数,这里为什么是a个连续的数不是a-1或者其他的呢,因为a是我们已经有的数,我们不能保证其他数字我们可以凑出来,如果你不懂我说的话,完全可以忽略这句。
这里还有个问题,我们如何能够得到a与b组合而成的序列呢,这里我们需要从小到大排好的序列,这样方便我们判断是否已经得到a个连续的序列了。
代码
#include <iostream>
using namespace std;
int a[1000000];
int main()
{
int n, m, num, pm, pn, p;
while(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<<a[p-m]-1<<endl;
}
return 0;
}