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

📢📢📢时间过得真快,转眼间已经打卡二十天了,距离省赛也已经就剩不到半个月了,但是感觉自己还是有很多不足,一些题目不能独立完成,唉,还有点时间,加油吧💪


  1. 💌💌💌纸张尺寸💌💌💌

📋问题描述

样例输入1

A0

样例输出1

1189
841

样例输入 2

A1

样例输出 2

841
594

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 512M

❓思路分享

📮题意很好理解,每次让长方形的长减半,A0就是不减半,A3就是减半三次。我们只需要在每次减半后更新长方形的长和宽即可(二者较长的为长,较短的为宽)。

📗参考代码

import java.util.Scanner;

/**
 * @ClassName 纸张尺寸
 * @Author @浅夜
 * @Date 2023/3/23 16:34
 * @Version 1.0
 */

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int l = 1189;
        int w = 841;
        char[] c = sc.nextLine().trim().toCharArray();
        for(char i = '0'; i < c[1];i++){
            l/=2;
            if(l < w) {
                int t = l;
                l = w;
                w = t;
            }
        }
//        System.out.println(c[1]);
        System.out.println(l);
        System.out.println(w);
    }
}


  1. 👻👻👻最大数字👻👻👻

📋问题描述

样例输入

123 1 2

样例输出

933

样例说明

对百位数字执行 2 次 2 号操作, 对十位数字执行 1 次 1 号操作。

评测用例规模与约定

对于 30% 的数据, 1≤N≤100; 0≤A,B≤10。

对于 100% 的数据, 1≤N≤10^17;0≤A,B≤100

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 512M

❓思路分享

📮我们要用两种有限次的操作使一个数变得尽可能大,一种操作是给某个数位加数字,另一种是给某个数位减数字。

📮那我们怎么样分配这两种操作才能使这个数尽可能大呢?

📮其实我们需要有一点贪心的思想:

  • 对于加操作,我们尽可能加在最高位,即使加不到9,只要加在最高位,肯定是比加在任何低于最高的数位都要大的。

  • 对于减操作,除非在限制次数内够减到9,否则我们宁可不减,因为如果减不到9,我们就让高的数位变小了,这样的话肯定不是我们期待的变化,继续在更低的数位判断就行。

📗参考代码

import java.io.*;

/**
 * @ClassName 最大数字
 * @Author @浅夜
 * @Date 2023/3/23 19:15
 * @Version 1.0
 */

public class 最大数字 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static int a, b, m;
    static String n;
    static long ans = 0;

    public static void main(String[] args) throws IOException {
        String[] s = br.readLine().split(" ");
        n = s[0];
        m = n.length();
        a = Integer.parseInt(s[1]);
        b = Integer.parseInt(s[2]);
        dfs(0,0);
//        out.println(ans);
        out.flush();
    }

    //考虑第i位  v表示当前的值
    static void dfs(int i, long v) {
        if (i == m) {
            ans = Math.max(ans, v);
            return;
        }
        int c = n.charAt(i) - '0';  //c表示数位为i的数
        //第一种操作 能加到9最好,加不到9也要加在高位
        int g = Math.min(a, 9 - c);  //不能超过次数限制
        a -= g;
        dfs(i + 1, v * 10 + c + g);
        //回溯
        a += g;
        //第二种使用
        if (b > c) {    //看限制次数够不够减到9  只有在够减的时候才减  不够宁愿不减
            b -= c + 1;   //减到9
            dfs(i + 1, v * 10 + 9);
            //回溯
            b += c + 1;
        }
        out.println(v);
    }
}


  1. 🍕🍕🍕全排列的价值🍕🍕🍕

📋问题描述

样例输入 1

3

样例输出 1

9

样例输入 2

2022

样例输出 2

593300958

❓思路分享

这道题目需要手推公式,看了题解还是不太懂,太笨了😭

附:题解(执梗)

📗参考代码

import java.io.*;

/**
 * @ClassName 全排列的价值
 * @Author @浅夜
 * @Date 2023/3/23 22:06
 * @Version 1.0
 */

public class 全排列的价值 {
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static long[] f = new long[1000010];
    static long[] g = new long[1000010];
    static int MOD = 998244353;

    public static void main(String[] args) throws IOException {
        int n = Integer.parseInt(br.readLine());
        f[1] = 0;
        init(n);
        for (int i = 2; i <= n; i++) {
            f[i] = (f[i - 1] * i % MOD + (long) i * (i - 1) / 2 % MOD * g[i - 1] % MOD) % MOD;
        }
        out.println(f[n]);
        out.flush();
    }

    static void init(int n) {
        long h = 1;
        for (int i = 1; i <= n; i++) {
            h *= i;
            h %= MOD;
            g[i] = h;
        }
    }
}


📢今天还是太水了,感觉稍微难一点的题就不行了,唉,好慌啊,感觉自己好菜,开小灶加餐去了,大家也要加油奥~

有收获的同学可以点点赞奥😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值