系列文章目錄
藍橋杯例題 枚舉和模擬
文章目錄
- 系列文章目錄
- 前言
- 一、好數:
- 題目參考:
- 核心思想:
- 代碼實現:
- 二、藝術與籃球:
- 題目參考:
- 核心思想:
- 代碼實現:
- 總結
前言
? ? ? ? 今天距離藍橋杯還有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;}}}}}
}
? ? ? ? ?像這里面我們也有一個模板來得到每一位,所以這個模板我們一定要記得,就是如果求每一位是如何得到的。
總結
? 以上就是這兩道題的見解,其實這種枚舉和模擬的題就是找出來相應的條件來進行枚舉,找出符合的,其實這個沒有什么難的,就是分析好這個過程就行,接下來我會持續更新藍橋杯的經典例題的,謝謝大家。