原题链接: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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复