解题思路:  我们看到这道题首先想到的肯定是用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;
}

    代码输完以后发现样式答案都对,但一提交就提示超时

所以这道题需要考研我们的算法,需要我们 找 规 律


56
7891011121314
41020355684120165220286

列出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

点赞(9)
 

0.0分

6 人评分

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

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

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

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

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

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

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

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

评论列表 共有 2 条评论

指针原来是套娃的 2年前 回复TA
实际的内核是隔板法,C(e-1,3)
milk 5年前 回复TA
这都能找规律,真乃神人也