解题思路:
在做这道题的时候我也是思考了很久,一直没有头绪,在查看了很多人的解法后,我觉得暴力求解最适合我,这里也将自己的理解分享给大家,我认为暴力求解是不走任何捷径的,从一开始依次去验证到末尾,直到得出答案(个人理解),在这个题中,它要求得是最大不能组合的数,对于这个最大,常规的想肯定是很难的,不然各位小伙伴也不会到解题区寻求思路,我就假设这个数在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的数,就是最大不能合成的数,输出即可。
图形:便于参考理解(图形借鉴他人)
参考代码:
#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分
20 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复