第十四届蓝桥杯 三十天刷题 第十一天

📢📢📢哈喽大家好,又见面了,时间过得真快啊,转眼间活动的三分之一已经过去了,前几天的文章太水了,原因是得了甲流一直不舒服,每天都感觉困困的,效率很低,唉不说了,大家注意身体奥。


  1. 🌈🌈🌈卡片🌈🌈🌈

📋问题描述

❓思路分享

🌈题目大意就是说用0-9的卡片来从1开始拼数字,问每张卡片2021张,能拼到几。

🌈那我们想一下,在这个过程中,哪个数字被用到次数最多,就是哪个数字最先被消耗完?没错,由于没有前导0,最先被消耗完的应该是卡片1。

🌈那么我们只需要统计数位为1的数量,需要用第2022个卡片1的数字减去1便是答案。

📗参考代码

/**
 * @ClassName 卡牌你
 * @Author @浅夜
 * @Date 2023/3/14 19:34
 * @Version 1.0
 */

public class Main {
    public static void main(String[] args) {
        int ans = 0;    //统计1的数量
        for (int i = 1; ; i++) {
            int t = i;
            while (t != 0) {
                if (t % 10 == 1) ans++;
                t /= 10;
            }
            if (ans == 2022) {
                System.out.println(i-1);
                break;
            }

        }
    }
}


  1. 🍍🍍🍍路径🍍🍍🍍

📋问题描述

❓思路分享(来自怂佬)

🍍对于某个点,它可以通过它之前的21个点获得,我们需要得到到达该点最小值,则对其取最小值即可,最小公倍数用模板来求。另外,1与任何数的最小公倍数为该数本身,那么我们只需要从22开始到2021,每一次对能到达位置的值取最小即可

📗参考代码

import java.io.*;
import java.util.Arrays;

/**
 * @ClassName 路径
 * @Author @浅夜
 * @Date 2023/3/14 20:08
 * @Version 1.0
 */

public class 路径 {
    public static void main(String[] args) throws Exception {
        int[] a = new int[2022];
        Arrays.fill(a, Integer.MAX_VALUE);  //要求最小,给每一个都放最大
        for (int i = 1; i <= 22; i++) a[i] = i;  //1与其他数的最小公倍数还是1
        for (int i = 22; i <= 2021; i++) {
            for (int j = 1; j <= 21; j++) {
                a[i] = Math.min(a[i], a[i - j] + lcm(i, i - j));
            }
        }
        System.out.println(a[2021]);
    }

    //最大公约数
    static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }

    //最小公倍数
    static int lcm(int a, int b) {
        return a / gcd(a, b) * b;//最小公倍数=两数之积÷两数最大公约数
    }
}


  1. 🍑🍑🍑字符统计🍑🍑🍑

📋问题描述

❓思路分享

🍑我们开一个长度为26 的数组来保存26个大写字母分别出现的次数,其次就是统计出现次数的时候用到的小技巧就是那个字符减去’A‘就会得到一个数字,这个数字就是该字符对应它在数组中的下标,A->0,Z->25。

🍑其次,题目还要求我们字母要按照字典序输出,我们该如何处理呢?

🍑其实用一个集合来按照出现次数保存并输出字母就可以,我们遍历保存字母出现次数的数组,维护一次最大出现次数到集合中,如果碰到了更大的,就将集合清空,将更大的放入,如果碰到跟最大出现次数一样大的,就添到集合当中,这样我们就达到了按照字典序排序的目的。

📗参考代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @ClassName 字符统计
 * @Author @浅夜
 * @Date 2023/3/14 20:57
 * @Version 1.0
 */

public class 字符统计 {
    static int[] a = new int[26];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] s = sc.nextLine().toCharArray();
        for(int i = 0;i<s.length;i++){
            a[s[i]-'A']++;
        }
        List<Integer> list = new ArrayList<>();
        int max = 0;
        for(int i = 0; i < 26;i++){
            if(a[i]>max) {
                list.clear();
                max = a[i];
                list.add(i);
            }else if(a[i] == max) list.add(i);
        }
        for(int i : list){
            System.out.print((char)(i + 'A'));
        }
    }
}


  1. 🌽🌽🌽费用报销🌽🌽🌽

01背包变种问题,01背包还没学,等学完了来补这道题哈哈,今天就先分享这么多啦,打卡去啦,时间越来紧张啦,要加油刷啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值