第十二届蓝桥杯 2021年国赛真题 (Java 大学C组)

蓝桥杯 2021年国赛真题(Java 大学 C 组 )

    • #A 整数范围
    • #B 带宽
    • #C 纯质数
    • #D 完全日期
    • #E 最小权值
    • #F 大写
    • #G 123
    • #H 异或变换
    • #I 冰山
    • #J 二进制问题


先挂题,有时间就写完


#A 整数范围

本题总分:5 分


问题描述

8 8 8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0 0 0,则一般能表示的最大值是多少?


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


255

calcCode:

public class Test {
     

    public static void main(String[] args) {
     
        System.out.print(0xFF);
    }
}

?


#B 带宽

本题总分:5 分


问题描述

小蓝家的网络带宽是 200 200 200 Mbps,请问,使用小蓝家的网络理论上每秒钟最多可以从网上下载多少 MB 的内容。


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


25

calcCode:

public class Test {
     

    public static void main(String[] args) {
     
        System.out.print(200 >> 3);
    }
}

ps 就是 per second,然后 1Mb = 8MB
就我感觉这题出的必被骂


#C 纯质数

本题总分:10 分


问题描述

如果一个正整数只有 1 1 1 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是: 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , ⋅ ⋅ ⋅ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · · 2,3,5,7,11,13,17,19,23,29,31,37,
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如: 2 , 3 , 5 , 7 , 23 , 37 2, 3, 5, 7, 23, 37 2,3,5,7,23,37 都是纯质数,而 11 , 13 , 17 , 19 , 29 , 31 11, 13, 17, 19, 29, 31 11,13,17,19,29,31 不是纯质数。当然 1 , 4 , 35 1, 4, 35 1,4,35 也不是纯质数。
请问,在 1 1 1 20210605 20210605 20210605 中,有多少个纯质数?


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


1903

calcCode:

public class Test {
     

    static final int n = 20210605, helper[] = {
      2, 3, 5, 7 };
    static boolean[] marked = new boolean[n + 1];

    public static void main(String[] args) {
     
        for (int i = 2; i <= n; i++)
            if (!marked[i])
                for (int j = i << 1; j <= n; j += i)
                    marked[j] = true;
        System.out.println(dfs(0, 0) - 1);
    }

    static int dfs(int depth, int k) {
     
        if (depth == 8) return (k <= n && !marked[k]) ? 1 : 0;
        int ans = marked[k]? 0: 1;
        for (int i = 0; i < 4; i++)
            ans += dfs(depth + 1, k * 10 + helper[i]);
        return ans;
    }
}

打表


#D 完全日期

本题总分:10 分


问题描述

如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如: 2021 2021 2021 6 6 6 5 5 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16 2 + 0 + 2 + 1 + 6 + 5 = 16 2+0+2+1+6+5=16,而 16 16 16 是一个完全平方数,它是 4 4 4 的平方。所以 2021 2021 2021 6 6 6 5 5 5 日是一个完全日期。
例如: 2021 2021 2021 6 6 6 23 23 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 2+0+2+1+6+2+3=16,是一个完全平方数。所以 2021 2021 2021 6 6 6 23 23 23 日也是一个完全日期。
请问,从 2001 2001 2001 1 1 1 1 1 1 日到 2021 2021 2021 12 12 12 31 31 31 日中,一共有多少个完全日期?


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


977

calcCode:

import java.time.LocalDate;

public class Test {
     

    public static void main(String[] args) {
     
        LocalDate start = LocalDate.of(2000, 12, 31);
        LocalDate end = LocalDate.of(2021, 12, 31);
        int ans = 0;
        while((start = start.plusDays(1)).compareTo(end) <= 0)
            if (check(start.toString())) ans++;
        System.out.println(ans);
    }

    static boolean check(String date) {
     
        int buff = 2;
        for (int i = 0; i < 10; i++)
            buff += Character.digit(date.charAt(i), 10);
        return buff == 3 * 3 || buff == 4 * 4 || buff == 5 * 5;
    }
}

最大是 20190929 最小是 20010101 也就是,它们组成的完全平方数在 3 4 5 的平方当中
本来想用 Stream 写的,但真去下手才发现自己的 Stream 学的真不像个东西


#E 最小权值

本题总分:15 分


问题描述

对于一棵有根二叉树 T T T,小蓝定义这棵树中结点的权值 W ( T ) W(T) W(T) 如下:
空子树的权值为 0 0 0
如果一个结点 v v v 有左子树 L L L, 右子树 R R R,分别有 C ( L ) C(L) C(L) C ( R ) C(R) C(R) 个结点,则 W ( v ) = 1 + 2 W ( L ) + 3 W ( R ) + ( C ( L ) ) 2 C ( R ) W(v) = 1 + 2W(L) + 3W(R) + (C(L))^{2} C(R) W(v)=1+2W(L)+3W(R)+(C(L))2C(R)
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有 2021 2021 2021 个结点的二叉树,树的权值最小可能是多少?


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


2653631372

calcCode:

public class Test {
     

    static final int n = 2021;

    public static void main(String[] args) {
     
        long dp[] = new long[n + 1];
        for (int k = 1; k <= n; k++) {
     
            dp[k] = Long.MAX_VALUE;
            for (int i = 0, j = k - 1; j >= 0; i++, j--)
                dp[k] = min(dp[k], 1 + 2 * dp[i] + 3 * dp[j] + i * i * j);
        }
        System.out.println(dp[2021]);
    }

    static long min(long a, long b) {
      return a < b ? a : b; }
}

我没有文化,我只是个大专

但这种可以用简单 dp 解决的还是蛮舒服的


#F 大写

时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分


问题描述

给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母转换成大写字母后将字符串输出。


输入格式

输入一行包含一个字符串。


输出格式

输出转换成大写后的字符串。


测试样例1

Input:
LanQiao

Output:
LANQIAO

评测用例规模与约定

对于所有评测用例,字符串的长度不超过 100 100 100


code:

public class Main {
     

    public static void main(String[] args) {
     
        System.out.println(new java.util.Scanner(System.in).next().toUpperCase());
    }
}

我就纳闷了,一天被这样连骂两次


#G 123

时间限制: 5.0s 内存限制: 512.0MB 本题总分:20 分


问题描述

小蓝发现了一个有趣的数列,这个数列的前几项如下:
1 , 1 , 2 , 1 , 2 , 3 , 1 , 2 , 3 , 4 , . . . 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, ... 1,1,2,1,2,3,1,2,3,4,...
小蓝发现,这个数列前 1 1 1 项是整数 1 1 1,接下来 2 2 2 项是整数 1 1 1 2 2 2,接下来 3 3 3 项是整数 1 1 1 3 3 3,接下来 4 4 4 项是整数 1 1 1 4 4 4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。


输入格式

输入的第一行包含一个整数 T T T,表示询问的个数。
接下来 T T T 行,每行包含一组询问,其中第 i i i 行包含两个整数 l i l_{i} li r i r_{i} ri,表示
询问数列中第 l i l_{i} li 个数到第 r i r_{i} ri 个数的和。


输出格式

输出 T 行,每行包含一个整数表示对应询问的答案。


测试样例1

Input:
3
1 1
1 3
5 8

Output:
1
4
8

评测用例规模与约定

对于 10 10 10% 的评测用例, 1 ≤ T ≤ 30 , 1 ≤ l i ≤ r i ≤ 100 1 ≤ T ≤ 30, 1 ≤ l_{i} ≤ r_{i} ≤ 100 1T30,1liri100
对于 20 20 20% 的评测用例, 1 ≤ T ≤ 100 , 1 ≤ l i ≤ r i ≤ 1000 1 ≤ T ≤ 100, 1 ≤ l_{i} ≤ r_{i} ≤ 1000 1T100,1liri1000
对于 40 40 40% 的评测用例, 1 ≤ T ≤ 1000 , 1 ≤ l i ≤ r i ≤ 1 0 6 1 ≤ T ≤ 1000, 1 ≤ l_{i} ≤ r_{i} ≤ 10^{6} 1T1000,1liri106
对于 70 70 70% 的评测用例, 1 ≤ T ≤ 10000 , 1 ≤ l i ≤ r i ≤ 1 0 9 1 ≤ T ≤ 10000, 1 ≤ l_{i} ≤ r_{i} ≤ 10^{9} 1T10000,1liri109
对于 80 80 80% 的评测用例, 1 ≤ T ≤ 1000 , 1 ≤ l i ≤ r i ≤ 1 0 12 1 ≤ T ≤ 1000, 1 ≤ l_{i} ≤ r_{i} ≤ 10^{12} 1T1000,1liri1012
对于 90 90 90% 的评测用例, 1 ≤ T ≤ 10000 , 1 ≤ l i ≤ r i ≤ 1 0 12 1 ≤ T ≤ 10000, 1 ≤ l_{i} ≤ r_{i} ≤ 10^{12} 1T10000,1liri1012
对于所有评测用例, 1 ≤ T ≤ 100000 , 1 ≤ l i ≤ r i ≤ 1 0 12 1 ≤ T ≤ 100000, 1 ≤ l_{i} ≤ r_{i} ≤ 10^{12} 1T100000,1liri1012

code:

import java.io.*;
import java.util.StringTokenizer;

public class Main {
     

    static int n = (int)Math.sqrt(2E12) + 1;
    static long[] row = new long[n], col = new long[n];

    public static void main(String[] args) {
     
        InputReader in = new InputReader(System.in);
        PrintWriter out = new PrintWriter(System.out);
        long T = in.nextLong(), buf;
        for (int i = 1; i < n; i++) {
     
            row[i] = i + row[i - 1];
            col[i] = col[i - 1] + row[i];
        }
        while (T-- > 0) {
     
            buf = in.nextLong();
            out.println(sum(in.nextLong()) - sum(buf - 1));
        }
        out.flush();
    }

    static long sum(long r) {
     
        int k = lower_bound(r);
        return r == row[k] ? col[k] : col[k - 1] + row[(int)(r - row[k - 1])];
    }

    static int lower_bound(long k) {
     
        int left = 0, right = n - 1, mid;
        while (left < right) {
     
            mid = left + right >> 1;
            if (row[mid] >= k) right = mid;
            else left = mid + 1;
        }
        return left;
    }

    static class InputReader {
     

        BufferedReader read;
        StringTokenizer tok;
        String delimiters;

        InputReader(InputStream in) {
      this(in, " \n\t\r\f"); }

        InputReader(InputStream in, String delimiters) {
     
            this.read = new BufferedReader(new InputStreamReader(in));
            this.delimiters = delimiters;
        }

        String next() {
     
            while (tok == null || !tok.hasMoreTokens())
                try {
     
                    tok = new StringTokenizer(read.readLine(), delimiters);
                } catch (IOException e) {
     
                    e.fillInStackTrace();
                }
            return tok.nextToken();
        }

        long nextLong() {
      return Long.parseLong(next()); }
    }
}

虽然感觉是简单数学
只能说 不会

用了 前缀和+二分+快速输入
只能说 蓝桥来作用了

去年在这的是几乎爆杀所有人的皮亚诺曲线


#H 异或变换

时间限制: 3.0s 内存限制: 512.0MB 本题总分:20 分


问题描述

小蓝有一个 01 01 01 s = s 1 s 2 s 3 ⋅ ⋅ ⋅ s n s = s_{1} s_{2} s_{3} · · · s_{n} s=s1s2s3sn
以后每个时刻,小蓝要对这个 01 01 01 串进行一次变换。每次变换的规则相同。
对于 01 01 01 s = s 1 s 2 s 3 ⋅ ⋅ ⋅ s n s = s_{1} s_{2} s_{3} · · · s_{n} s=s1s2s3sn,变换后的 01 01 01 s ′ = s ′ 1 s ′ 2 s ′ 3 ⋅ ⋅ ⋅ s ′ n s′ = s′_{1}s′_{2}s′_{3}· · · s′_{n} s=s1s2s3sn 为:
s ′ 1 = s 1 s′_{1} = s_{1} s1=s1;
s ′ i = s i − 1 ⊕ s i s′_{i} = s_{i−1} ⊕ s_{i} si=si1si
其中 a ⊕ b a ⊕ b ab 表示两个二进制的异或,当 a a a b b b 相同时结果为 0 0 0,当 a 和 b
不同时结果为 1 1 1
请问,经过 t t t 次变换后的 01 01 01 串是什么?


输入格式

输入的第一行包含两个整数 n , t n, t n,t,分别表示 01 01 01 串的长度和变换的次数。
第二行包含一个长度为 n n n 01 01 01 串。


输出格式

输出一行包含一个 01 01 01 串,为变换后的串。


测试样例1

Input:
5 3
10110

Output:
11010

Explanation:
初始时为 10110,变换 1 次后变为 11101,变换 2 次后变为 10011,变换 3 次后变为 11010。

评测用例规模与约定

对于 40 40 40% 的评测用例, 1 ≤ n ≤ 100 , 1 ≤ t ≤ 1000 1 ≤ n ≤ 100, 1 ≤ t ≤ 1000 1n100,1t1000
对于 80 80 80% 的评测用例, 1 ≤ n ≤ 1000 , 1 ≤ t ≤ 1 0 9 1 ≤ n ≤ 1000, 1 ≤ t ≤ 10^{9} 1n1000,1t109
对于所有评测用例, 1 ≤ n ≤ 10000 , 1 ≤ t ≤ 1 0 18 1 ≤ n ≤ 10000, 1 ≤ t ≤ 10^{18} 1n10000,1t1018


code:

// 没啥思路,暴力骗分不想写

#I 冰山

时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分


问题描述

一片海域上有一些冰山,第 i i i 座冰山的体积为 V i V_{i} Vi
随着气温的变化,冰山的体积可能增大或缩小。第 i i i 天,每座冰山的变化量都是 X i X_{i} Xi。当 X i > 0 X_{i} > 0 Xi>0 时,所有冰山体积增加 X i X_{i} Xi;当 X i < 0 X_{i} < 0 Xi<0 时,所有冰山体积减少 − X i −X_{i} Xi;当 X i = 0 X_{i} = 0 Xi=0 时,所有冰山体积不变。
如果第 i i i 天某座冰山的体积变化后小于等于 0 0 0,则冰山会永远消失。
冰山有大小限制 k k k。如果第 i i i 天某座冰山 j j j 的体积变化后 V j V_{j} Vj 大于 k k k,则它会分裂成一个体积为 k k k 的冰山和 V j − k V_{j} − k Vjk 座体积为 1 1 1 的冰山。
i i i 天结束前(冰山增大、缩小、消失、分裂完成后),会漂来一座体积为 Y i Y_{i} Yi 的冰山( Y i = 0 Y_{i} = 0 Yi=0 表示没有冰山漂来)。
小蓝在连续的 m m m 天对这片海域进行了观察,并准确记录了冰山的变化。小蓝想知道,每天结束时所有冰山的体积之和(包括新漂来的)是多少。
由于答案可能很大,请输出答案除以 998244353 998244353 998244353 的余数。


输入格式

输入的第一行包含三个整数 n , m , k n, m, k n,m,k,分别表示初始时冰山的数量、观察的天数以及冰山的大小限制。
第二行包含 n n n 个整数 V 1 , V 2 , ⋅ ⋅ ⋅ , V n V_{1}, V_{2}, · · · , V_{n} V1,V2,,Vn,表示初始时每座冰山的体积。
接下来 m m m 行描述观察的 m m m 天的冰山变化。其中第 i i i 行包含两个整数 X i , Y i X_{i}, Y_{i} Xi,Yi,意义如前所述。


输出格式

输出 m m m 行,每行包含一个整数,分别对应每天结束时所有冰山的体积之和除以 998244353 998244353 998244353 的余数。


测试样例1

Input:
1 3 6
1
6 1
2 2
-1 1

Output:
8
16
11

Explanation:
在本样例说明中,用 [a1, a2, · · · , an] 来表示每座冰山的体积。
初始时的冰山为 [1]。
第 1 天结束时,有 3 座冰山:[1, 1, 6]。
第 2 天结束时,有 6 座冰山:[1, 1, 2, 3, 3, 6]。
第 3 天结束时,有 5 座冰山:[1, 1, 2, 2, 5]。

评测用例规模与约定

对于 40 40 40% 的评测用例, n , m , k ≤ 2000 n, m, k ≤ 2000 n,m,k2000
对于 60 60 60% 的评测用例, n , m , k ≤ 20000 n, m, k ≤ 20000 n,m,k20000
对于所有评测用例, 1 ≤ n , m ≤ 100000 , 1 ≤ k ≤ 1 0 9 , 1 ≤ V i ≤ k , 0 ≤ Y i ≤ k , − k ≤ X i ≤ k 1 ≤ n, m ≤ 100000, 1 ≤ k ≤ 10^{9}, 1 ≤ V_{i} ≤ k, 0 ≤ Y_{i} ≤ k,−k ≤ X_{i} ≤ k 1n,m100000,1k109,1Vik,0Yik,kXik


code:

// 5s, 写个大模拟就够了,不想写

#J 二进制问题

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分


问题描述

小蓝最近在学习二进制。他想知道 1 1 1 N N N 中有多少个数满足其二进制表示中恰好有 K K K 1 1 1。你能帮助他吗?


输入格式

输入一行包含两个整数 N N N K K K


输出格式

输出一个整数表示答案。


测试样例1

Input:
7 2

Output:
3

评测用例规模与约定

对于 30% 的评测用例, 1 ≤ N ≤ 1 0 6 , 1 ≤ K ≤ 10 1 ≤ N ≤ 10^{6}, 1 ≤ K ≤ 10 1N106,1K10
对于 60% 的评测用例, 1 ≤ N ≤ 2 × 1 0 9 , 1 ≤ K ≤ 30 1 ≤ N ≤ 2 × 10^{9}, 1 ≤ K ≤ 30 1N2×109,1K30
对于所有评测用例, 1 ≤ N ≤ 1 0 18 , 1 ≤ K ≤ 50 1 ≤ N ≤ 10^{18}, 1 ≤ K ≤ 50 1N1018,1K50


code:

import java.util.Scanner;

public class Main {
     

    static int[][] dp = new int[65][65];

    public static void main(String[] args) {
     
        Scanner in = new Scanner(System.in);
        long n = in.nextLong(), ans = 0;
        int k = in.nextInt();
        dp[0][0] = 1;
        for (int i = 1; i <= 64; i++)
            for (int j = 1; j <= 64; j++)
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
        for (int i = 63; i >= 0; i--) {
     
            if ((n >> i & 1) == 1) ans += dp[i + 1][k-- + 1];
            if (k == 0) {
      ans++; break; }
        }
        System.out.println(ans);
    }
}

n = 13 k = 2
toBinary(n) = 0b1101
设我们需要完成函数 f(n, k) 举例:

f(0b1101, 2) = f(0b111, 2) + (f(0b101, 1) = …)

f(0b0111, 2) = { 2 2 , 2 1 , 2 0 } \{ 2^{2}, 2^{1}, 2^{0} \} { 22,21,20} 中 选择 K = 2 个元素所能组成的子集个数

简单数学

你可能感兴趣的:(java,蓝桥杯)