系列文章目录
蓝桥杯例题 枚举和模拟
文章目录
- 系列文章目录
- 前言
- 一、好数:
- 题目参考:
- 核心思想:
- 代码实现:
- 二、艺术与篮球:
- 题目参考:
- 核心思想:
- 代码实现:
- 总结
前言
今天距离蓝桥杯还有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;
}
}
}
}
}
}
像这里面我们也有一个模板来得到每一位,所以这个模板我们一定要记得,就是如果求每一位是如何得到的。
总结
以上就是这两道题的见解,其实这种枚举和模拟的题就是找出来相应的条件来进行枚举,找出符合的,其实这个没有什么难的,就是分析好这个过程就行,接下来我会持续更新蓝桥杯的经典例题的,谢谢大家。