蓝桥杯省赛备战笔记—— (六)枚举 + 枚举练习题
枚举就是根据提出的问题,一- -列出该问题的所有 可能的解,并在逐一-列出的过程中, 检验每个可能解是否是问题的真正解,
如果是就采纳这个解,如果不是就继续判断下一个。
枚举法- - -般比较直观,容易理解,但由于要检查所有的可能解,因此运行效率较低。
例题:寒假作业
在这篇博客里解决过,有两种方法:
https://www.cnblogs.com/expedition/p/12243498.html
例题:方程的解
样例输入
1000
样例输出
6 8 30
10 18 24
#include<stdio.h> int main(){ int n; scanf("%d",&n); for(int a = 1;a * a <= n;a++){ for(int b = a + 1; a*a + b*b <= n;b++){ for(int c = b + 1;a*a + b*b+ c*c <= n;c++ ){ if(a*a + b*b+ c*c == n ){ printf("%d %d %d\n",a,b,c); } } } } return 0; }
例题:求最大子阵
上一篇博客中也解决过
https://www.cnblogs.com/expedition/p/12330848.html
例题:四平方和
#include<stdio.h> #include<math.h> int get(int n){ for(int a= 0; a*a <= n;a++){ for(int b = a; a*a + b*b <= n;b++){ for(int c = b; a*a + b*b + c*c <= n;c++){ int d = sqrt( n - a*a - b*b - c*c); if(a*a + b*b + c*c +d*d == n){ printf("%d %d %d %d",a,b,c,d); return 0; } } } } } int main(){ int n; scanf("%d",&n); get(n); return 0; }
例题:装饰效果
#include<stdio.h> int a[105]; int main(){ int n; scanf("%d",&n); for(int i = 0; i< n;i++){ scanf("%d",&a[i]); } int ans = 0; int sum; for(int i = 0;i < n;i++){ sum = 0; for(int j = i; j< n;j++){ sum += a[j]; if(sum > ans) ans = sum; } } printf("%d",ans); return 0; }
例题:双截棍
#include<stdio.h> int a[105]; int main(){ int n; scanf("%d",&n); for(int i = 0; i< n;i++){ scanf("%d",&a[i]); } int ans = 10000; for(int i = 0; i < n;i++){ for(int j = i+ 1;j < n;j++){ if(a[j] >= a[i]){ if(a[j] - a[i] < ans){ ans = a[j] - a[i]; } }else{ if(a[i] - a[j] < ans){ ans = a[i] - a[j]; } } } } printf("%d",ans); return 0; }