第十三届蓝桥杯大赛软件赛省赛第二场(Java 大学A组)


  太久没写题了,调下状态。


试题 A: 练习

本题总分: 5 5 5


【问题描述】

  小蓝在蓝桥杯练习系统上做题。做到一道题,他编写好程序,在自己的电脑上尝试了题目中提供的几个样例,全部得到了正确的结果,可是当他将自己的程序提交到练习系统上时,却得了 0 0 0 分,这种情况可能的原因是什么?请在以下选项中选择所有可能导致这种情况的原因。

   A . \mathrm A. A. 题目中的样例一般比较小,在评测的时候可能使用的评测用例比较大,小蓝的程序虽然在小样例能得到解,对于大一些的评测用例可能速度太慢,超过了题目要求的时间限制。

   B . \mathrm B. B. 小蓝的内存使用过多,虽然在自己的电脑上运行正确,可是在评测的内存限制下无法运行。

   C . \mathrm C. C. 小蓝的程序有考虑不足之处,题目中的样例比较小,小蓝的程序恰好能得到对应的结果,可是当评测用例比较复杂时,小蓝的程序无法得到正确的结果。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,按字母顺序给出所选择的选项,在提交答案时只填写这个字符串,填写多余的内容将无法得分。例如,如果选项全部正确,请填写答案 A B C \mathrm{ABC} ABC


ABC


在这里插入图片描述


试题 B: 超级质数

本题总分: 5 5 5


【问题描述】

  如果一个质数 P P P 的每位数字都是质数,而且每两个相邻的数字组成的两位数是质数,而且每三位相邻的数字组成的三位数是质数,依次类推,如果每相邻的 k k k 位数字组成的 k k k 位数都是质数,则 P P P 称为超级质数。

  如果把超级质数 P P P 看成一个字符串,则这个超级质数的每个子串都是质数。

  例如, 53 53 53 是一个超级质数。

  请问,最大的超级质数是多少?

【答案提交】

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


373


递推


  若 n n n 是质数,而 ⌊ n 10 ⌋ 、 n − 1 0 ⌊ log ⁡ 10 n ⌋ ⌊ n 1 0 ⌊ log ⁡ 10 n ⌋ ⌋ \lfloor\frac n{10}\rfloor、n - 10^{\lfloor\log_{10}n\rfloor}\lfloor\frac n{10^{\lfloor\log_{10}n\rfloor}}\rfloor 10nn10log10n10log10nn 同为超级质数,则 n n n 同为超级质数。

  递推就完事了。

import java.util.*;

public class Test {
   

    public static void main(String[] args) {
    new Test().run(); }

    int[] P = {
    2, 3, 5, 7 };

    long ans = 0;

    void run() {
   
        Queue<Long> queue = new ArrayDeque();
        HashMap<Long, Long> map = new HashMap();
        for (long p : P) {
   
            queue.offer(p);
            map.put(p, p);
        }
        while (!queue.isEmpty()) {
   
            long now = queue.poll();
            long head = map.get(now);
            long buff = (now - head) * 10;
            ans = Math.max(ans, now);
            for (long p : P) {
   
                long temp = now * 10 + p;
                if (millerRabin(temp) &&
                    map.containsKey(buff + p)) {
   
                    map.put(temp, head * 10);
                    queue.offer(temp);
                }
            }
        }
        System.out.println(ans);
    }

    int time = 50;
    
    boolean millerRabin(long n) {
   
        if (n % 2 == 0) return n == 2;
        long b = n - 1;
        int k = 0;
        for (; b % 2 == 0; ++k, b /= 2);
        for (int i = 0, j; i < time; ++i) {
   
            long a = (int)(Math.random() * (n - 1) + 1);
            long v = qpow(a, b, n);
            if (v == 1) continue;
            for (j = 0; j < k; ++j) {
   
                if (v == n - 1) break;
                v = multi(v, v, n);
            }
            if (j == k) return false;
        }
        return true;
    }

    long multi(long a, long b, long p) {
   
        long prod = 0;
        while (b > 0) {
   
            if (b % 2 == 1) prod = (prod + a) % p;
            a = (a + a) % p;
            b >>= 1;
        }
        return prod;
    }

    long qpow(long a, long b, long p) {
   
        long pow = 1;
        while (b > 0) {
   
            if (b % 2 == 1) pow = multi(pow, a, p);
            a = multi(a, a, p);
            b >>= 1;
        }
        return pow;
    }
}

试题 C: 考勤刷卡

时间限制: 3.0 s 3.0\mathrm s 3.0s 内存限制: 512.0 M B 512.0\mathrm{MB} 512.0MB 本题总分: 10 10 10


【问题描述】

  小蓝负责一个公司的考勤系统,他每天都需要根据员工刷卡的情况来确定每个员工是否到岗。

  当员工刷卡时,会在后台留下一条记录,包括刷卡的时间和员工编号,只要在一天中员工刷过一次卡,就认为他到岗了。

  现在小蓝导出了一天中所有员工的刷卡记录,请将所有到岗员工的员工编号列出。

【输入格式】

  输入的第一行包含一个正整数 n n n,表示一天中所有员工的刷卡记录的条数。

  接下来 n n n 行,每行包含一条刷卡记录,每条刷卡记录的格式为:

   H H : M M : S S    I D \mathrm{HH:MM:SS\ \ ID} HH:MM:SS  ID

  其中 H H : M M : S S \mathrm{HH:MM:SS} HH:MM:SS 表示刷卡时间, H H \mathrm{HH} HH 为一个 0 0 0 23 23 23 之间的两位十进制整数(可能含前导 0 0 0)表示时, M M \mathrm{MM} MM 为一个 0 0 0 59 59 59 之间的两位十进制整数(可能含前导 0 0 0)表示分, S S \mathrm{SS} SS 为一个 0 0 0 59 59 59 之间的两位十进制整数(可能含前导 0 0 0)表示秒, I D \mathrm{ID} ID 为一个不含前导 0 0 0 的整数表示员工的编号。

  所有记录按照刷卡时间升序排列,可能同一时刻有多人刷卡。

【输出格式】

  输出若干行,每行包含一个整数,按照从小到大的顺序输出,表示到岗员工的编号。

【样例输入】

4
13:05:42 103
14:07:12 4567
15:03:00 103
17:00:21 1

【样例输出】

1
103
4567

【评测用例规模与约定】

  对于 50 % 50\% 50% 的评测用例, 1 ≤ n ≤ 100 1 ≤ n ≤ 100 1n100
  对于所有评测用例, 1 ≤ n ≤ 10000 1 ≤ n ≤ 10000 1n10000,员工编号为不超过 1 0 9 10^9 109 的正整数。


  感觉有诈,但读了几遍也没瞅着陷阱,

  鉴定为纯纯的签到。

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.TreeSet;
import java.util.Set;

public class Main {
   

    public static void main(String[] args) {
    new Main().run(); }

    void run() {
   
        try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
             PrintWriter out = new PrintWriter(System.out)) {
   
            int n = Integer.parseInt(in.readLine());
            Set<Integer> set = new TreeSet();
            while (n-- > 0) {
   
                String line = in.readLine();
                set.add(Integer.parseInt(
                    line.substring(line.indexOf(0x20) + 1)
                ));
            }
            for (Integer id : set) out.println(id);
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
}

试题 D: 最大和

时间限制: 3.0 s 3.0\mathrm s 3.0s 内存限制: 512.0 M B 512.0\mathrm{MB} 512.0MB 本题总分: 10 10 10


【问题描述】

  小蓝在玩一个寻宝游戏,游戏在一条笔直的道路上进行,道路被分成了 n n n 个方格,依次编号 1 1 1 n n n,每个方格上都有一个宝物,宝物的分值是一个整数(包括正数、负数和零),当进入一个方格时即获得方格中宝物的分值。小蓝可以获得的总分值是他从方格中获得的分值之和。

  小蓝开始时站在方格 1 1 1 上并获得了方格 1 1 1 上宝物的分值,他要经过若干步到达方格 n。

  当小蓝站在方格 p p p 上时,他可以选择跳到 p + 1 p + 1 p+1 p + D ( n − p ) p + D(n − p)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值