解题思路:

在做这道题的时候我也是思考了很久,一直没有头绪,在查看了很多人的解法后,我觉得暴力求解最适合我,这里也将自己的理解分享给大家,我认为暴力求解是不走任何捷径的,从一开始依次去验证到末尾,直到得出答案(个人理解),在这个题中,它要求得是最大不能组合的数,对于这个最大,常规的想肯定是很难的,不然各位小伙伴也不会到解题区寻求思路,我就假设这个数在100000之内(范围足够大),后台测试数据中的最大不能组成值应该都在这个范围内,我定义一个数组a[101000],初值均为0,之所以多加1000,那是因为输入的两个数范围都不超过1000,所以在循环100000次中,a[i+m],a[i+n],(m,n为两个输入的数)才不会导致数组越界,以至于报错,输入的两个数m,n,最小的数以下的数都是不能都由m,n组合的,所以循环从i=最小的开始循环,由于m,n本身符合可以由他们组成,所以循环开始时,a[m]=a[n]=1,(1代表可以组成的数,0代表不能组成)在循环体中,如果a[i]==1,那么a[i+m]和a[i+n]也是可以由他们组合而成的,所以都为1,如果a[i]!=1,那就将i赋给不能合成的数imax,从最小输入数一直循环到100000,最后一次赋给imax的数,就是最大不能合成的数,输出即可。

图形:便于参考理解(图形借鉴他人)


QQ图片20210323213812.png

参考代码:

#include<iostream>
using namespace std;
int main()
{
 int m,n,imax,i,a[101000]={0};
 cin>>m>>n;
 a[m]=a[n]=1;
 if(m>n)
 {
  i=m;
  m=n;
  n=i;
 }
 for(i=m;i<100000;i++)
 {
  if(a[i]==1)
  a[i+m]=a[i+n]=1;
  else
  imax=i;
 }
 cout<<imax<<endl;
 return 0;
 }


点赞(0)
 

0.0分

20 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

lw1234 1年前 回复TA
棒棒的
back2zer0 2年前 回复TA
谢谢
保佑不打水漂 2年前 回复TA
这个内存貌似会溢出