解题思路:设输入的两个数分别为min,max,则可以看出,若x(x>max),x+1,x+2,...,x+min-1这连续的min个数都可以用min,max组合表示,则大于x+min-1的数一定也都可以,这就是循环的结束条件,也是此题关键。此题只能暴力求解,你尽可能优化算法使它少尝试一些次数就好了,这题宽容度很高,很容易过。
证明:x可以用min,max两个数组合表示,那x+min肯定也行。x+1可以用min,max两个数组合表示,那x+1+min肯定也行。由此类推,大于x+min-1的数都能用min,max组合表示。
注意事项:为什么说此题不好,因为答案可用公式计算,结果为min*max-min-max,并且,当min和max同为偶数时,此题无解,因为奇数不能由偶数组合而成。
不过他的测试用例不会出现两个偶数的。
参考代码:
#include
using namespace std;
int a1,a2;//输入的两个数
int attempt(int now,int mi,int ma)//判断now这个数能否用mi和ma表示,能返回1,不能返回0
{ //ma表示两个数中大的那个,mi表示小的
for(int i=0;i<=now/ma;i++)//依次尝试0个ma,1个ma,2个ma...(now/ma)个ma
{
if((now-i*ma)%mi==0)
{
return 1;
}
}
return 0;
}
int main()
{
cin>>a1>>a2;
int max_num=max(a1,a2);
int min_num=min(a1,a2);
int fa=max_num+1;//从max_num+1开始尝试
int now_max_ans=fa;//now_max_ans表示目前最大题解
int times=0;//连续多少个数能用a1,a2表示
while(1)
{
if(attempt(fa,min_num,max_num))
{
times++;
}
else
{
times=0;
now_max_ans=fa;
}
if(times==min_num)//当连续min_num个数都能用a1,a2表示时,说明之后的数都能,故跳出循环
{
break;
}
fa++;
}
cout<<now_max_ans;
return 0;
}
0.0分
3 人评分