当前位置:   article > 正文

2019年第十届蓝桥杯省赛试题及详解(Java本科A组)_给定一个长度为 n 的数组 a=[a 1 ,a 2 , a n ],数组中有可能有重复出现的整数

给定一个长度为 n 的数组 a=[a 1 ,a 2 , a n ],数组中有可能有重复出现的整数

【蓝桥杯】历年真题题目及题解汇总


  1. 结果填空 (满分5分)
  2. 结果填空 (满分5分)
  3. 结果填空 (满分10分)
  4. 结果填空 (满分10分)
  5. 结果填空 (满分15分)
  6. 程序设计(满分15分)
  7. 程序设计(满分20分)
  8. 程序设计(满分20分)
  9. 程序设计(满分25分)
  10. 程序设计(满分25分)

第一题:平方和

【问题描述】

小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574,平方和是 14362。 注意,平方和是指将每个数分别平方后求和。

请问,在 1 到 2019 中,所有这样的数的平方和是多少?
答案:2658417853

  1. public class Main{
  2. public static boolean hasChar(String s){
  3. char[] chars=s.toCharArray();
  4. for (int i = 0; i <chars.length ; i++) {
  5. if(chars[i]=='2'||chars[i]=='0'||chars[i]=='1'||chars[i]=='9'){
  6. return true;
  7. }
  8. }
  9. return false;
  10. }
  11. public static void main(String[] args) {
  12. BigInteger res=new BigInteger("0");
  13. for (int i = 1; i <= 2019; i++) {
  14. String s=String.valueOf(i);
  15. if(hasChar(s)){
  16. BigInteger temp=new BigInteger(s);
  17. res=res.add(temp.multiply(temp));
  18. }
  19. }
  20. System.out.println(res);
  21. }
  22. }

第二题:数列求值

【问题描述】

给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字

答案:4659

  1. public class Main{
  2. public static void main(String[] args) {
  3. // System.out.println(fib(201903,1,1,1));
  4. int one=1;
  5. int two=1;
  6. int three=1;
  7. int res=0;
  8. for (int i = 3; i <20190324 ; i++) {
  9. res=(one+two+three)%10000;
  10. one=two%10000;
  11. two=three%10000;
  12. three=res;
  13. }
  14. System.out.println(res);
  15. }
  16. }

第三题:迷宫

【问题描述】

下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方

  1. 010000
  2. 000100
  3. 001001
  4. 110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。

对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。(如果你把以下文字复制到文本文件中,请务 必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 maze.txt, 内容与下面的文本相同)
 

  1. class Node {
  2. int step;
  3. String path;
  4. int x, y;
  5. public Node(int step, String path, int x, int y) {
  6. super();
  7. //步数
  8. this.step = step;
  9. //路径
  10. this.path = path;
  11. this.x = x;
  12. this.y = y;
  13. }
  14. }
  15. public class Main {
  16. static Scanner in = new Scanner(System.in);
  17. static int n, m;
  18. static char[][] maze = new char[60][60];
  19. static boolean[][] vis = new boolean[60][60];
  20. //增量数组,方向向量,直接按字典序排列
  21. static int[] X = { 1, 0, 0, -1 };
  22. static int[] Y = { 0, -1, 1, 0 };
  23. static String[] d = { "D", "L", "R", "U" };
  24. public static void main(String[] args) throws FileNotFoundException {
  25. Scanner in = new Scanner(new File("/Users/pengzijun/Desktop/lanqiaoTraining/src/lq2019/maze.txt"));
  26. n = 30;
  27. m =50;
  28. //存入矩阵
  29. for (int i = 1; i <= n; ++i) {
  30. String temp = in.next();
  31. for (int j = 1; j <= m; ++j) {
  32. maze[i][j] = temp.charAt(j - 1);
  33. }
  34. }
  35. bfs();
  36. }
  37. static boolean check(int x, int y) {
  38. if (x < 1 || x > n || y < 1 || y > m)
  39. //不在范围内
  40. return false;
  41. if (vis[x][y] || maze[x][y] == '1')
  42. //已经访问过或者是墙
  43. return false;
  44. return true;
  45. }
  46. static void bfs() {
  47. Queue<Node> q = new LinkedList<Node>();
  48. //offer 与add在有限制的队列添加元素不抛出异常,而是返回false
  49. q.offer(new Node(0, "", 1, 1));
  50. while (!q.isEmpty()) {
  51. //头节点
  52. Node top = q.poll();
  53. //设置为已经访问
  54. vis[top.x][top.y] = true;
  55. if (top.x == n && top.y == m) {
  56. //走到边界节点
  57. System.out.println(top.step + " " + top.path);
  58. return;
  59. }
  60. for (int i = 0; i < 4; ++i) {
  61. int newX = top.x + X[i];
  62. int newY = top.y + Y[i];
  63. if (check(newX, newY)) {
  64. //把可以走的邻近节点都加进去
  65. Node temp = new Node(top.step + 1, top.path + d[i], newX, newY);
  66. q.offer(temp);
  67. }
  68. }
  69. }
  70. }
  71. }

第四题:最大降雨量

【问题描述】

由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。

这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个 数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使 用。

每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术 施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。 由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
答案:34

第五题:RSA 解密

【问题描述】

RSA 是一种经典的加密算法。它的基本加密过程如下。首先生成两个质数 p, q,令 n = p · q,设 d 与 (p − 1) · (q − 1) 互质,则可 找到 e 使得 d · e 除 (p − 1) · (q − 1) 的余数为 1。

n, d, e 组成了私钥,n, d 组成了公钥。

当使用公钥加密一个整数 X 时(小于 n),计算 C = X**d 密后的密文。

当收到密文 C 时,可使用私钥解开,计算公式为 X = C**e 例如,当 p = 5, q = 11, d = 3 时,n = 55, e = 27。 若加密数字 24,得 243 mod 55 = 19。解密数字 19,得 1927 mod 55 = 24。

mod n,则 C 是加 mod n。

现在你知道公钥中 n = 1001733993063167141, d = 212353,同时你截获了 别人发送的密文 C = 20190324,请问,原文是多少?
 

  1. public class Main{
  2. /*
  3. java 大数转为long,记得后面最后面那个是l/L
  4. */
  5. static long n = 1001733993063167141L;
  6. static long d = 212353;
  7. static long c = 20190324;
  8. static long p = 2;
  9. static long q = 0;
  10. static long phi;
  11. static long e = 1;
  12. static long x1 = 0, y1 = 0;
  13. static long ans = 1;
  14. /**
  15. 求解p和q的
  16. */
  17. public static void qiue() {
  18. while (n % p != 0) {
  19. p++;
  20. }
  21. q = n / p;
  22. }
  23. public static long quickmod(long a, long b) {
  24. long x = 0;
  25. while (b != 0) {
  26. if (b % 2 == 1) {
  27. x = (x + a) % n;
  28. }
  29. a = (a + a) % n;
  30. b /= 2;
  31. }
  32. return x;
  33. }
  34. // 用快速幂求模,每次求模后余数相乘,得到最后的答案
  35. // 每当要用到乘法时,用快速乘,再模,求余数
  36. public static void quickmul(long c, long e) {
  37. while (e != 0) {
  38. if (e % 2 == 1) {
  39. ans = quickmod(ans, c);
  40. }
  41. e /= 2;
  42. c = quickmod(c, c);
  43. }
  44. }
  45. public static void gcd(long i, long j, long a, long b) {
  46. //欧几里得扩展求乘法逆元
  47. if (j == 0) {
  48. x1 = 1;
  49. y1 = 0;
  50. return;
  51. }
  52. gcd(j, i % j, x1, y1);
  53. long temp = x1;
  54. x1 = y1;
  55. y1 = temp - i / j * y1;
  56. e = x1;
  57. return;
  58. }
  59. public static void main(String[] args) {
  60. //求解p、q
  61. qiue();
  62. phi = (p - 1) * (q - 1);
  63. gcd(d, phi, x1, y1);
  64. e = (e + phi) % phi;
  65. quickmul(c, e);
  66. System.out.print(ans);
  67. }
  68. }

第六题:完全二叉树的权值

【问题描述】

给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1, A2, · · · A**N,如下图所示:

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是 1。

  1. public class Main{
  2. public static void main(String[] args) {
  3. Scanner s = new Scanner(System.in);
  4. int n = s.nextInt();
  5. int[] nums = new int[n];
  6. for (int i = 0; i < n; i++) {
  7. nums[i] = s.nextInt();
  8. }
  9. //最大权值和
  10. BigInteger max = new BigInteger("0");
  11. //当前权值和
  12. BigInteger cur = new BigInteger("0");
  13. //深度
  14. int depth= 1;
  15. int index = 0;
  16. for (int i = 1; i <= n; i++) {
  17. cur = cur.add(new BigInteger(String.valueOf(nums[i - 1])));
  18. if (i == Math.pow(2, depth) - 1) {
  19. //当前节点为本层最后一个
  20. if (cur.compareTo(max) == 1) {
  21. //当前层权值和大于最大值
  22. max = cur;
  23. index = depth;
  24. }
  25. //当前层权值归零,计算下层
  26. cur = new BigInteger("0");
  27. //层数加一
  28. depth++;
  29. }
  30. }
  31. System.out.println(index);
  32. }
  33. }

第七题:外卖店优先级

【问题描述】

“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。

每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。

给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。

【输入格式】

第一行包含 3 个整数 N、M 和 T。以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到

一个订单。

【输出格式】

输出一个整数代表答案。

【样例输入】

266 11 52 31 62 21 62

【样例输出】

1

【样例解释】

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。

【评测用例规模与约定】

对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。 对于所有评测用例,1 ≤ N,M,T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。
 

  1. public class Main{
  2. public static void main(String[] args) {
  3. Scanner s = new Scanner(System.in);
  4. int N = s.nextInt();
  5. int M = s.nextInt();
  6. int T = s.nextInt();
  7. Map<Integer, Integer> data = new TreeMap<Integer, Integer>();
  8. //res[i][j] 表示i时刻 j店铺的优先值
  9. int[][] res = new int[T + 1][N + 1];
  10. int[] ids = new int[M];
  11. int[] ts = new int[M];
  12. for (int i = 0; i < M; i++) {
  13. int key = s.nextInt();
  14. int value = s.nextInt();
  15. res[key][value] += 2;
  16. }
  17. int count = 0;
  18. ArrayList<Integer> arrayList=new ArrayList<>();
  19. for (int i = 1; i < T + 1; i++) {
  20. for (int j = 1; j < N + 1; j++) {
  21. if (res[i][j] == 0) {
  22. //当前时刻没有订单,优先值-1,最少为0
  23. res[i][j] = (res[i - 1][j] - 1) > 0 ? (res[i - 1][j] - 1) : 0;
  24. if (res[i][j] <= 3) {
  25. //踢出队列
  26. if(arrayList.contains(j)){
  27. //店铺在队列中则踢出
  28. arrayList.remove((Object)j);
  29. }
  30. }
  31. }
  32. else {
  33. //当前时刻有订单,累加
  34. res[i][j] += res[i - 1][j];
  35. if (res[i][j] > 5) {
  36. //加入队列
  37. if(!arrayList.contains(j)){
  38. arrayList.add(j);
  39. }
  40. }
  41. }
  42. }
  43. }
  44. System.out.println(arrayList.size());
  45. }
  46. }

第八题:修改数组

【问题描述】

给定一个长度为 N 的数组 A = [A1, A2, · · · A**N ],数组中有可能有重复出现 的整数。

现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改 A2,A3,··· ,A**N。

当修改 A**i 时,小明会检查 A**i 是否在 A1 ∼ A**i−1 中出现过。如果出现过,则 小明会给 A**i 加上 1 ;如果新的 A**i 仍在之前出现过,小明会持续给 A**i 加 1 ,直 到 A**i 没有在 A1 ∼ A**i−1 中出现过。

当 A**N 也经过上述修改之后,显然 A 数组中就没有重复的整数了。 现在给定初始的 A 数组,请你计算出最终的 A 数组。

【输入格式】

第一行包含一个整数 N。 第二行包含N个整数A1,A2,··· ,A**N 。

【输出格式】

输出N个整数,依次是最终的A1,A2,··· ,A**N。

【样例输入】

5 21134

【样例输出】

21345 【评测用例规模与约定】

对于 80% 的评测用例,1 ≤ N ≤ 10000。 对于所有评测用例,1 ≤ N ≤ 100000,1 ≤ A**i ≤ 1000000。
 

  1. public class Main{
  2. public static void main(String[] args) {
  3. Scanner s= new Scanner(System.in);
  4. int n=s.nextInt();
  5. int[] nums=new int[n+1];
  6. for (int i = 0; i <n ; i++) {
  7. int temp=s.nextInt();
  8. while(nums[temp]!=0){
  9. temp++;
  10. }
  11. nums[temp]++;
  12. System.out.print(temp+" ");
  13. }
  14. }
  15. }

第九题:糖果

问题描述】

糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种 口味编号 1 ∼ M。

小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售。

幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知 道每包内的糖果口味。

给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖 果。

【输入格式】

第一行包含三个整数 N、M 和 K。接下来 N 行每行 K 这整数 T1, T2, · · · , T**K,代表一包糖果的口味。

【输出格式】

一个整数表示答案。如果小明无法品尝所有口味,输出 −1。

【样例输入】

6 5 3

1 1 2

1 2 3

1 1 3

2 3 5

5 4 2

5 1 2

【样例输出】

2

【评测用例规模与约定】

对于30%的评测用例,1 ≤ N ≤ 20。 对于所有评测样例,1≤N≤100,1≤M≤20,1≤K≤20,1≤T**i ≤M。
 

  1. public class Main{
  2. static Scanner sc = new Scanner(System.in);
  3. static int[][] a = new int[105][25];
  4. static int[] sta = new int[105];
  5. static int[] dp = new int[(1<<20)+5];
  6. public static void main(String[] args) {
  7. int n=sc.nextInt();
  8. int m=sc.nextInt();
  9. int k=sc.nextInt();
  10. Arrays.fill(dp, -1);
  11. dp[0]=0;
  12. for(int i=1;i<=n;i++){
  13. for(int j=1;j<=k;j++){
  14. a[i][j]=sc.nextInt();
  15. sta[i]|=1<<(a[i][j]-1);
  16. }
  17. dp[sta[i]]=1;
  18. }
  19. for(int i=1;i<=n;i++){
  20. for(int j=0;j<(1<<m);j++){
  21. if(dp[j]==-1) continue;
  22. if(dp[j|sta[i]]==-1||dp[j]+1<dp[j|sta[i]]){
  23. dp[j|sta[i]]=dp[j]+1;
  24. }
  25. }
  26. }
  27. System.out.println(dp[(1<<m)-1]);
  28. }
  29. }

第十题:组合数问题

【问题描述】

给n,m,k,求有多少对(i,j)满足1 ≤ i ≤ n,0 ≤ j ≤ min(i,m)且Cij ≡ 0(mod k),k 是质数。其中 Cij 是组合数,表示从 i 个不同的数中选出 j 个组成 一个集合的方案数。

【输入格式】

第一行两个数 t, k,其中 t 代表该测试点包含 t 组询问,k 的意思与上文中 相同。

接下来 t 行每行两个整数 n, m,表示一组询问。 【输出格式】

输出 t 行,每行一个整数表示对应的答案。由于答案可能很大,请输出答 案除以 109 + 7 的余数。

【样例输入】

12 33

【样例输出】

1

【样例说明】

在所有可能的情况中,只有 C21 = 2 是 2 的倍数。

【样例输入】

25

67

【样例输出】

0 7

【样例输入】

3 23
23333333 23333333 233333333 233333333 2333333333 2333333333

【样例输出】

851883128

959557926

680723120

【数据规模和约定】

对于所有评测用例,1 ≤ k ≤ 108, 1 ≤ t ≤ 105, 1 ≤ n, m ≤ 1018,且 k 是质数。 评测时将使用 10 个评测用例测试你的程序,每个评测用例的限制如下:

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/302867
推荐阅读
相关标签
  

闽ICP备14008679号