原题链接:A+B+C+D
解题思路: 我们看到这道题首先想到的肯定是用for循环来暴力破解
例如:
#include <stdio.h> void f() //利用4层for求符合条件的数量 { int e,sum=0,a,b,c,d; //sum记录符合条件的数量 scanf("%d",&e); for(a=1;a<e;a++) { if(a>=e-2) break; for(b=1;b<e;b++) { if(b>e-a) break; //当b>e-a的时候a+b+c+d的值必大于e,因此跳出循环减少运算量 for(c=1;c<e;c++) { if(c>e-a-b) break; //与11行同理 for(d=1;d<e;d++) { if(d>e-a-b-c) break; //与11行同理 if(a+b+c+d==e) sum++; //符合条件sum+1 } } } } printf("%d\n",sum); } int main() { int t,i; scanf("%d",&t); for(i=0;i<t;i++) f(); //调用t次函数 return 0; }
代码输完以后发现样式答案都对,但一提交就提示超时。
所以这道题需要考研我们的算法,需要我们 找 规 律。
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
4 | 10 | 20 | 35 | 56 | 84 | 120 | 165 | 220 | 286 |
列出e取5~14的输出
发现
5*6*7=35*6 |
6*7*8=56*6 |
7*8*9=84*6 |
8*9*10=120*6 |
因此得到规律:满足条件的对数 =(e-1) * (e-2) * (e-3) / 6
注意事项: 细心就会找到规律,细心观察
参考代码:
#include <stdio.h> int main() { int e,t,i; scanf("%d",&t); for(i=0;i<t;i++) //程序循环t次 { scanf("%d",&e); printf("%d\n",(e-1)*(e-2)*(e-3)/6); //利用规律得到符合条件的对数并输出 } return 0; }
为满足同学做题,特整理出此题解。@LLS
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复