资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
—————————————————————————————————————————
小明开了一家糖果店。
他别出心裁:把水果糖包成4颗一包和7颗一包的两种。
糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。
当然有些糖果数目是无法组合出来的,比如要买10颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。
大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
—————————————————————————————————————————
输入格式
两个正整数n,m,表示每种包装中糖的颗数。
输出格式
一个正整数,表示最大不能买到的糖数。
数据范围
2≤n,m≤1000,
保证数据一定有解。
—————————————————————————————————————————
用户输入:
4 7
程序应该输出:
17
用户输入:
3 5
程序应该输出:
7
—————————————————————————————————————————
资源约定:
峰值内存消耗<64M
CPU消耗<3000ms
根据题目,我们可以分析 xn + ym = ?,题目要求的是,不能用xn + ym来表示的最大的数是什么,目前想到的就是暴力搜索,两层循环,将a[xn+ym] = 1进行标记,表示可以用xn + ym 来表示。当我们遍历a时,当a[i] == 0,就表示不能用xn+ym。那么最大的那个i就是我们想要求的数,考虑到数据会爆掉。因此采用打表法来找规律得最终结果。
先根据题目写出一个能运行小部分数据的程序:(特别注意的是,有解的情况下,那么n和m一定是互质的)
#include<stdio.h>
intmain()
{
longinta[100000];
intp ,q;
scanf("%d%d",&p,&q);
for(intx=0; x<=1000;x++)
{
for(inty=0; y<=1000;y++)
{
a[x*p+y*q] =1;
}
}
intmax=0;
for(inti=0; i<1000;i++)
if(a[i] ==0)
{
max=i;
}
printf("%d",max);
return0;
}
然后输入数据寻找规律
m | n | x | m | x | ||
3 | 5 | 7 | 4 | 3 | 5 | |
3 | 7 | 11 | 4 | 5 | 11 | |
3 | 8 | 13 | 4 | 7 | 17 |
开始找规律:
m = 3 时,n每增加1,那么x就增加2。考虑2倍关系,发现x = 2n-3
m = 4 时, n每增加2, 那么x就增加6。考虑3倍关系,发现x = 3n-4
再观察一下m和n和x三者之间的关系,发现 x = (m-1)n - m
因此可以写出以下程序:完美通关
#include<stdio.h>
intmain()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d",(m-1)*n-m);
return0;
}