解题思路:
1:要采取何种方式去分析出可能的数?
答:由题中给的数据可以发现,数据量实际不大,每组都有无穷种组合,可实际上只需要分析其前面的一小部分,那么考虑用暴力枚举法,简单粗暴且直观
2:找到何种规律?(以题中给的7、4为例子)最小从7+4=11开始,每组分析7+4=11各数据
如下表格整除用**表示,不可组成用##表示,其他地方用数表示组成
4 | 7 | 11 | ||
11 | / | / | ** | |
12 | ** | / | / | |
13 | ## | |||
14 | / | ** | / | |
15 | 2 | 1 | / | |
16 | ** | / | / | |
17 | ## | |||
18 | 1 | 2 | ||
19 | 3 | 1 | ||
20 | ** | / | / | |
21 | / | ** | / |
由上表分析就可以得到规律:
1:所有的数是这样组成的:
a.可以组成的数:要么本身能被4、7或4+7整除;要么本身一直减去4+7直到值小于4+7后的能被4或7整除的;
b.不能构成的数:除以上的情况所有的数;
2:由题目得知17是最大的不可构成数,则再往后的4+7位 即22~32不会再出现##
综上所述,解题思路抽象为:
a.每次分析a+b个数,如果里面有不可构造数,则记录值为index(为了更简便,采用从大到小的方式分析),并开始分析下一组数;
b.重复a直到目前组中没有再出现不可构造数;
c:答案为index
参考代码:
#include
int woc(int k,int c,int b)//判断是否为不可构造数,是则返回0,否则1
{
int flog=0,m=k;
while(m>=c+b)//数大于c+b时的分析
{
if(m%c==0||m%b==0||m%(c+b)==0)
{
flog=1;
break;
}
else{
int l=c+b;
m-=l;
}
}
if(m%c==0||m%b==0)//数小于c+b时的分析
{
flog=1;
}
if(flog==1)
{
return 0;
}
return 1;
}
int main()
{
int a[2000]={0},c,b;
scanf("%d %d",&c,&b);
int flog=0,index=0,j=1;
flog=(j+1)*(b+c)-1;//每次从一组数中最大的数开始分析
for(int i=c+b-1;i>=0;i--)
{
a[i]=flog;//每轮从最后一位数位开始
flog--;//无不可构造数时正常减
if(woc(a[i],c,b))//有不可构数时
{
index=a[i];//记录位置
i=c+b;//检测到则还原
j++;//调整倍数
flog=(j+1)*(b+c)-1;//调整初始数 (//每次从一组数中最大的数开始分析)
}
}
printf("%d\n",index);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复