系列文章目录
蓝桥杯例题 枚举和模拟
文章目录
- 系列文章目录
- 前言
- 一、好数:
- 题目参考:
- 核心思想:
- 代码实现:
- 二、艺术与篮球:
- 题目参考:
- 核心思想:
- 代码实现:
- 总结
前言
今天距离蓝桥杯还有13天,时间不多了,我也在复习,而我们最容易掌握的就是暴力来写题,因此今天给大家补充两道枚举和模拟类的题,下面是我的讲解过程。
一、好数:
题目参考:
核心思想:
其实好数这道题就是典型的枚举,因为我们需要把从1开始枚举到我们输入的数来判断这个数是不是好数,所以我们要枚举来找是不是符合条件就对了。
代码实现:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int N = scan.nextInt();int count = 0;for(int i = 1;i<=N;i++){count +=solve(i);}System.out.println(count);scan.close();}public static int solve(int num){//这是进行每个数的分解位数的基本操作int digit = 1;//用来维护奇偶数位的while(num>0){int t = num%10;//这里面的细节就是从个位开始取if(digit % 2 == 1){if(t%2 == 0){return 0;} }else{if(t%2 == 1){return 0;}}num/=10;digit++;}return 1;}
}
这道题我认为较重要需要掌握的就是如何从个位依次得到每一位,这在许多地方都需要使用这个固定模板。
二、艺术与篮球:
题目参考:
核心思想:
这个日期格式的题也是一个枚举模拟的题,非常典型,这个就体现出来了数组的重要性,我们分别把笔画和每月的天数存到数组当中,其实也可以用HashMap键值对来存,这里面我们用数组来存,然后就是计算笔画权值跟50来进行比较,从2000枚举到2024年4月13号。
代码实现:
public class Main {// 每月天数数组,平年默认2月28天static int[] months = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};static int[] hz = {13, 1, 2, 3, 5, 4, 4, 2, 2, 2}; // 数字对应的权值// 判断是否为闰年public static boolean leap(int year) {return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);}public static void main(String[] args) {solve();}public static void solve() {int ans = 0; // 符合条件的日期个数// 遍历年份for (int year = 2000; year <= 2024; year++) {// 根据年份来确定2月份是闰年还是平年months[2] = leap(year) ? 29 : 28;// 遍历月份for (int month = 1; month <= 12; month++) {// 遍历每天for (int day = 1; day <= months[month]; day++) {int cnt = 0; // 日期的权值总和int y1, y2, y3, y4, m1, m2, d1, d2;// 提取年份、月份和日期的各个位y1 = year / 1000;y2 = (year / 100) % 10;y3 = (year / 10) % 10;y4 = year % 10;m1 = month / 10;m2 = month % 10;d1 = day / 10;d2 = day % 10;// 计算日期权值总和cnt = hz[y1] + hz[y2] + hz[y3] + hz[y4] + hz[m1] + hz[m2] + hz[d1] + hz[d2];// 如果日期的权值总和大于50,符合条件if (cnt > 50) {ans++;}// 当到达2024年4月13日时输出并结束if (year == 2024 && month == 4 && day == 13) {System.out.println(ans);return;}}}}}
}
像这里面我们也有一个模板来得到每一位,所以这个模板我们一定要记得,就是如果求每一位是如何得到的。
总结
以上就是这两道题的见解,其实这种枚举和模拟的题就是找出来相应的条件来进行枚举,找出符合的,其实这个没有什么难的,就是分析好这个过程就行,接下来我会持续更新蓝桥杯的经典例题的,谢谢大家。