目录

第十届

求和

题目

题解

代码

矩形切割

题目

题解一

代码

代码

代码

题解二

代码

不同子串

题目

题解

代码

质数

题目

题解

代码

最大降雨量

题目

题解

代码

旋转

题目

题解

代码

外卖店优先级

题目

题解

代码

代码

代码

人物相关性分析

题目

题解

代码

总结

系列


第十届

求和

题目

题解

一道非常简单的题,模拟寻找2、0、1、9的过程即可。答案:1905111

代码

public class Main {public static void main(String[] args) {String s;int sum = 0;for (int i = 1; i <= 2019; i++) {s = i + "";if (s.contains("0") || s.contains("1") || s.contains("2") || s.contains("9")) {sum += Integer.parseInt(s);}}System.out.println(sum);}
}

矩形切割

题目

题解一

根据题目的样例画图可知每次切割的正方形的边长是整个矩形中长的那一条边,并且最终得到的正方形数量是切割次数加 1 或者说当长边和短边相等时还要加 1 

答案:21

代码

public class Main {public static void main(String[] args) {int h = 2019, w = 324;int sum = 0;do {if (h > w) {h -= w;} else {w -= h;}sum++;} while (h != w);System.out.println(sum + 1);}
}

代码

public class Main {public static void main(String[] args) {int h = 2019, w = 324;int sum = 0;while (true) {sum++;if (h > w) {h -= w;} else if (w > h) {w -= h;}else {break;}}System.out.println(sum);}
}

代码

参考:https://www.lanqiao.cn/questions/194300/

public class Main {public static void main(String[] args) {System.out.println(qie(2019, 324));}/*** 每次递归就相当于与切割一次,每切割一次正方形个数加 1** @param a 长边* @param b 短边* @return 切出正方形个数*/static int qie(int a, int b) {if (a == b) {return 1;}return 1 + qie(Math.max(a - b, b), Math.min(a - b, b));}
}

题解二

根据题目的样例画图可知每次切割后多出的边是长边除短边 以5×3的矩形为例即:

第一次切割:5÷3=1……2——>得到新的边长2

第二次切割:3÷2=1……1——>得到新的边长1

第三次切割:2÷1=2……0——>得到新的边长0,说明此次切割得到的矩形是正方形不用再切割

分析可以发现整个过程就是求最大公约数,答案就是两边相除的商

参考:https://www.lanqiao.cn/questions/184683/

代码

public class Main {public static void main(String[] args) {gcd(2019, 324);System.out.println(count);}static int count = 0;public static int gcd(int a, int b) {if (b == 0) {return a;}count += a / b;return gcd(b, a % b);}
}

不同子串

题目

题解

一道非常简单的题目,两个for循环暴力破解,利用Set元素不重复的特性即可得到答案:100

因为substring()左闭右开的特点所以要注意for循环的范围,不要写错了!

代码

import java.util.HashSet;
import java.util.Set;public class Main {public static void main(String[] args) {String s = "0100110001010001";Set<String> set = new HashSet<>();for (int i = 0; i < s.length(); i++) {for (int j = i + 1; j <= s.length(); j++) {set.add(s.substring(i, j));}}System.out.println(set.size());}
}

质数

题目

题解

这也是一道非常简单的题,for循环暴力查找即可 答案:17569

代码

public class Main {public static void main(String[] args) {int count = 1;boolean flag;for (int i = 3; ; i += 2) {flag = true;int t = (int) Math.sqrt(i);for (int j = 3; j <= t; j += 2) {if (i % j == 0) {flag = false;break;}}if (flag) {if (count == 2019 - 1) {System.out.println(i);return;}count++;}}}
}

最大降雨量

题目

题解

这道题的意思是将 1 到 49 分为7组数字,每组7个数字,求七组数字中每组数字的中位数所构成的数列的中位数的最大值。因为中位数是按顺序排列的一组数据中居于中间位置的数,所以这七组数据是顺序排列的,那么每组数列从后往前数,数到中位数就停下来,因为要保证中位数最大,中位数前面的数列任意即可。例如:

 图片中是其中一种情况。

也可以这样想:因为要保证所求中位数最大,所以要让所求中位数小于所求中位数所在行最后三位数,并且还要让所求中位数小于他之后所有行包括中位数在内的最后四位数

参考:https://www.lanqiao.cn/questions/185737/

代码

public class Main {public static void main(String[] args) {System.out.println(49 - (3 * 4 + 3));}
}

旋转

题目

题目描述

图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。

我们用一个 n×m 的二维数组来表示一个图片,例如下面给出一个 3×4 的 图片的例子:

1 3 5 7

9 8 7 6

3 5 9 7

这个图片顺时针旋转 90 度后的图片如下:

3 9 1

5 8 3

9 7 5

7 6 7

给定初始图片,请计算旋转后的图片。

输入描述

输入的第一行包含两个整数 n,m,分别表示行数和列数。

接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像 素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。

输出描述

输出 m 行 n 列,表示旋转后的图片。

输入输出样例

示例

输入

3 4
1 3 5 7
9 8 7 6
3 5 9 7

输出

3 9 1
5 8 3
9 7 5
7 6 7

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

题解

这道题不难,不要看题目写那么多,其实这道题的目的就是将给的矩阵行变成列,列变成行

代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int[][] a = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {a[i][j] = sc.nextInt();}}for (int i = 0; i < n; i++) {for (int j = m - 1; j >= 0; j--) {System.out.print(a[j][i] + " ");}System.out.println();}}
}

外卖店优先级

题目

题目描述

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

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

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

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

输入描述

第一行包含 3 个整数 N,M,T。

以下 M 行每行包含两个整数 ts,id,表示 ts 时刻编号 id 的外卖店收到一个订单。

其中,1≤N,M,T≤10^5,1≤ts≤T,1≤id≤N。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

输出

1

样例解释:

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

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 256M

题解

这道题没有什么高大上的解法(目前没看到),就是模拟题目描述的过程。蓝桥杯给的难度是:中等、标签是:模拟。蓝桥杯的模拟类的题目也不一定是简单题。这道题才算是真正考察我们将某个事件抽象成程序的能力。

这道题蓝桥云课的测试数据很水,建议去试题集的历届真题测试更好。

写了不少蓝桥杯题目,很少碰到运行时间允许在 3s 以内的题,正好这道题就是。所以我使用了快读,毕竟是提到模拟类的题就怕超时。

详细的过程代码的注释写的很清楚,这里就不在重复。

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;public class Main {static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static int nextInt() throws IOException {st.nextToken();return (int) st.nval;}public static void main(String[] args) throws IOException {// n 家外卖店int n = nextInt();// m 条订单信息int m = nextInt();// t 时刻以内int t = nextInt();// 存储 m 条订单信息int[][] order = new int[m][2];// 输入订单信息for (int i = 0; i < order.length; i++) {for (int j = 0; j < order[i].length; j++) {order[i][j] = nextInt();}}// 根据订单时间升序排序,时间相同根据外卖店 id 升序排序Arrays.sort(order, (e1, e2) -> (e1[0] == e2[0] ? (e1[1] - e2[1]) : (e1[0] - e2[0])));// 外卖店 idint shop;// 外卖店优先级int[] priority = new int[n];// 是否在优先缓存中 1表示在优先缓存中 0表示不在优先缓存中int[] cache = new int[n];// 最大时间就是上面时刻排序后的最后一个值for (int i = 1; i <= order[m - 1][0]; i++) {// 外卖店在该时刻是否有订单boolean[] isOrder = new boolean[n];for (int j = 0; j < order.length; j++) {if (order[j][0] >= i) {// 时间相等则有订单if (order[j][0] == i) {// 获取外卖店 idshop = order[j][1];// 当前时刻该外卖店有订单isOrder[shop - 1] = true;// 当前时刻该外卖店有订单则优先级增加 2priority[shop - 1] += 2;// 如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中if (priority[shop - 1] > 5) {cache[shop - 1] = 1;}
//                        想继续优化减少运行时间,结果是反向优化,运行时间更长了,但是在某些测试样例还是有用的
//                        if (j + 1 != order.length) {
//                            continue;
//                        }}if (order[j][0] > i || j + 1 == order.length) {for (int k = 0; k < n; k++) {// 如果外卖店没有订单,则优先级会减少 1if (!isOrder[k] && priority[k] > 0) {priority[k]--;}// 如果优先级小于等于 3,则会被清除出优先缓存if (priority[k] <= 3 && cache[k] == 1) {cache[k] = 0;}}break;}}}}int sum = 0;for (int j : cache) {sum += j;}System.out.println(sum);}
}

参考:我同学写的,上面的代码是我优化后的

看到有两位大佬的题解实现了时间和空间极致压缩,下面的代码是我稍微优化了一下,运行时间快了一点点,感兴趣可以动手测试一下。

代码

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;public class Main {static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static int nextInt() throws IOException {st.nextToken();return (int) st.nval;}/*** T 时刻以内*/static int T;public static void main(String[] args) throws IOException {// n 家外卖店int n = nextInt();// m 条订单信息int m = nextInt();// T 时刻以内T = nextInt();// 根据外卖店 id 存储订单信息ArrayList<Integer>[] a = new ArrayList[n + 1];for (int i = 1; i <= n; i++) {a[i] = new ArrayList();}// ts 时刻编号 id 的外卖店收到一个订单int ts, id;while (m-- > 0) {ts = nextInt();id = nextInt();a[id].add(ts);}int ans = 0;for (int i = 1; i <= n; i++) {// 将每个外卖店有订单的时刻按时间升序排序Collections.sort(a[i]);if (check(a[i])) {ans++;}}System.out.println(ans);}public static boolean check(ArrayList<Integer> list) {// 该外卖店在T时刻以内订单总数int n = list.size();// 该外卖店在T时刻以内订单数量 <=2 优先级最多为 4 不可能加入优先缓存中if (n <= 2) {return false;}// 外卖店优先级int sum = 2;// 是否在优先缓存中// 默认优先级小于等于 3,被清除出优先缓存boolean flag = false;// 外卖店前后连续两次有订单的时刻int pre, cur;for (int i = 0; i + 1 < n; i++) {pre = list.get(i);cur = list.get(i + 1);if (pre != cur) {// 如果外卖店没有订单,则优先级会减少 1,最低减到 0// pre != cur 说明pre时刻到cur时刻内有某时刻外卖店没有订单,则优先级会减少对应时刻sum = Math.max(sum - (cur - pre - 1), 0);}// 当前时刻该外卖店有订单则优先级增加 2sum += 2;}// 如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中if (sum > 5) {flag = true;}// 当前外卖店所有订单优先级计算完后,还需计算最后有订单的时刻到 T 时刻内没有订单的时刻要减少多少优先级sum -= (T - list.get(n - 1));// 如果优先级小于等于 3,则会被清除出优先缓存if (sum <= 3) {flag = false;}return flag;}
}

参考:https://www.lanqiao.cn/questions/227570/

代码

import java.io.*;
import java.util.*;public class Main {static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static int nextInt() throws IOException {st.nextToken();return (int) st.nval;}public static void main(String[] args) throws IOException {int N = nextInt();int M = nextInt();int T = nextInt();int[] p = new int[N + 1];boolean[] incache = new boolean[N + 1];//**创建二维不定长数组List<Integer>[] g = new ArrayList[N + 1];for (int i = 1; i <= N; i++) {g[i] = new ArrayList<>();}for (int i = 0; i < M; i++) {int ts = nextInt();int id = nextInt();g[id].add(ts);}int ans = 0;for (int i = 1; i <= N; i++) {int size = g[i].size();if (size == 0) {continue;}//按时间排下序Collections.sort(g[i]);//获取i号店的第一个订单时刻int now = g[i].get(0);int pre = now;for (int j = 0; j < size; j++) {now = g[i].get(j);int cha = now - pre;if (cha != 0 && cha != 1) {p[i] -= cha - 1;if (p[i] < 0) {p[i] = 0;}if (p[i] <= 3) {incache[i] = false;}}p[i] += 2;if (p[i] > 5) {incache[i] = true;}pre = now;}int cha = T - pre;if (cha > 0) {p[i] -= cha;if (p[i] <= 3) {incache[i] = false;}}if (incache[i]) {ans++;}}System.out.println(ans);}
}

参考:https://blog.dotcpp.com/a/72220

人物相关性分析

题目

题目描述

小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。

更准确的说,小明定义 Alice 和 Bob "同时出现" 的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。

例如以下文本:

This is a story about Alice and Bob.Alice wants to send a private message to Bob.

假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是"Alice and Bob" 和 "Bob. Alice"。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。

注意:

  1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。

  2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。

输入描述

第一行包含一个整数 K(1≤K≤106)。

第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 10^6。

输出描述

输出一个整数,表示 Alice 和 Bob 同时出现的次数。

输入输出样例

示例

输入

20
This is a story about Alice and Bob.Alice wants to send a private
message to Bob.

输出

2

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题解

这道模拟类的题暴力破解一定可以得到部分的分数,比如我在C语言网纯暴力破解测试得分有80+的分数,不出意外是超时,这也是这道题的难点,因为暴力破解不得不考虑时间问题,而这道题的时间限制是 1s ,与上一题相比这道题的时间卡的很死。这道题我没想到是用到了滑动窗口或者叫尺取法,这里我就不献丑了,直接看y总的视频在29:52开始讲解本题。我看了网上其他人的题解,不是超时就是内存超限,能AC的代码基本都可以是y总视频中讲的方法,y总yyds。

另外说一下,在蓝桥杯的试题集提交本题的话始终是零分,一开始以为是我有问题直到我看了测试用例

输入:

3
1 1 1

输出:

3
看完我都不知道说什么好输入的完全牛头不对马嘴,每年收那么多钱就不能认真干活,不愧被称为圈钱杯(垃圾蓝桥杯狗都不参加)

代码

import java.io.*;
import java.util.ArrayList;public class Main {public static void main(String[] args) throws NumberFormatException, IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int k = Integer.parseInt(br.readLine());String str = br.readLine();ArrayList<Integer> a = new ArrayList<>();ArrayList<Integer> b = new ArrayList<>();for (int i = 0; i + 5 <= str.length(); i++) {if ((i == 0 || check(str.charAt(i - 1))) && ((i + 5) == str.length() || check(str.charAt(i + 5)))) {if ("Alice".equals(str.substring(i, i + 5))) {a.add(i);}}}for (int i = 0; i + 3 <= str.length(); i++) {if ((i == 0 || check(str.charAt(i - 1))) && ((i + 3) == str.length() || check(str.charAt(i + 3)))) {if ("Bob".equals(str.substring(i, i + 3))) {b.add(i);}}}long res = 0;for (int i = 0, l = 0, r = -1; i < a.size(); i++) {while (r + 1 < b.size() && a.get(i) >= b.get(r + 1)) {r++;}while (l <= r && a.get(i) - 1 - (b.get(l) + 3) + 1 > k) {l++;}res += r - l + 1;}for (int i = 0, l = 0, r = -1; i < b.size(); i++) {while (r + 1 < a.size() && b.get(i) >= a.get(r + 1)) {r++;}while (l <= r && b.get(i) - 1 - (a.get(l) + 5) + 1 > k) {l++;}res += r - l + 1;}System.out.println(res);}private static boolean check(char c) {return (c < 'a' || c > 'z') && (c < 'A' || c > 'Z');}
}

参考:https://www.lanqiao.cn/questions/227649/ 

总结

这些题在第十届中除了最后两题属于简单题(我认为不是),在考试中应该是必拿的分考的是我们模拟某种事件将其转换为程序的能力和发现规律的能力,此类题型一般是填空题或数据范围较小的编程题(最后两题不按套路来),因为暴力模拟一般会超时

其他题目持续更新中。。。。。。

系列

蓝桥杯Java大学C组近三年真题解析(一)——暴力、模拟题_疯狂的格式化的博客-CSDN博客

蓝桥杯Java大学C组近三年真题解析(二)——暴力、模拟题_疯狂的格式化的博客-CSDN博客

蓝桥杯Java大学C组近三年真题解析(三)——暴力、模拟题相关推荐

  1. 蓝桥杯Java大学C组近三年真题解析(二)——暴力、模拟题

    目录 第十一届 约数个数 题目 题解 代码 代码 寻找 2020 题目 题解 代码 代码 跑步锻炼 题目 题解 代码 代码 代码 灵活使用Excel 平面分割 题目 题解 代码 代码 七段码 题目 ​ ...

  2. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛2020.7.5】【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  3. 蓝桥杯java初赛本科组,2012年第三届蓝桥杯全国软件专业人才设计与开发大赛Java本科组初赛试题...

    这是2012年第三届蓝桥杯全国软件专业人才设计与开发大赛Java本科组初赛试题的完整版 2012第三届蓝桥杯软件大赛Java语言本科组初赛试题 (说明:1-4题为结果填空,5-7为程序填空,8-10为 ...

  4. 第十三届蓝桥杯Python 大学B组真题详解

    第十三届蓝桥杯Python B组真题详解 试题A 排列字母 试题B 寻找整数 试题C 纸张尺寸 试题D 位数排序 试题E 蜂巢 试题F 消除游戏 试题G 全排列的价值 试题H 技能升级 试题I 最长不 ...

  5. 蓝桥杯2016年JavaB组省赛(代码+解析)

    目录 **第一题:煤球数目** **第二题:生日蜡烛** **第四题:分小组** **第五题 抽签** **第六题:方格填数** **第七题:剪邮票** **第八题:四平方和** **第九题:取球博弈 ...

  6. 蓝桥杯——java(b组)省赛

            目录 ​ 1.等差数列 解题思路: 源码附上: 2.世纪末的星期天 解题思路 常用的日历字段 源码附上: 1.等差数列 等差数列 解题思路: 源码附上: import java.uti ...

  7. 2018年第九届蓝桥杯Java本科B组国赛题解

    第一题 标题:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) 求该三角形的面积. 注意,要提交的是一个小数形式表示的浮点数 ...

  8. 3a三次方h c语言表达式,希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题...

    原创 标题:希尔伯特曲线 希尔伯特曲线是以下一系列分形曲线 Hn 的极限.我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和 ...

  9. 2019年第十届蓝桥杯国赛B组试题G-排列数-next_permutation枚举,模拟

    在一个排列中,一个折点是指排列中的一个元素,它同时小于两边的元素,或者同时大于两边的元素. 对于一个 1∼n 的排列,如果可以将这个排列中包含 t个折点,则它称为一个 t+1 单调序列. 例如,排列 ...

最新文章

  1. 2021-2027年中国视频监控设备行业市场需求预测与投资战略规划分析报告
  2. python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
  3. 和get redis_Redis练习操作
  4. KVM虚拟化的简单概论
  5. JVM001_类文件结构
  6. (39)FPGA面试技能提升篇(nandflash接口)
  7. .net core精彩实例分享 -- 网络编程
  8. sql_action
  9. nyoj------20吝啬的国度
  10. java读取mysql配置文件_MySql主从复制,从原理到实践
  11. Java使用冒泡排序对数据进行排序,带注释
  12. 代码回滚:Reset、Checkout、Revert的选择(转)
  13. 自卑都是自己不踏实做事的表现
  14. firework cs4入门
  15. CAD图形不闭合问题的解决方法
  16. html文字发亮_CSS3字体发光效果
  17. jq多选按钮值_JQuery 多选按钮checkbox
  18. 轻奢消费人群画像报告
  19. t.cn新浪短链接 生成
  20. 2020年黑龙江省大豆种植分布数据

热门文章

  1. JavaScipt30(第七个案例)(主要知识点:数组some,every,findIndex方法)
  2. 三菱数控系统PLC格式转换
  3. 通信云江湖里的融云野望
  4. word中如何设置表格跨页自动设置表头
  5. 酒店计算机操作规程,某酒店前台操作规程..doc
  6. 网页直播/点播播放器支持WebRTC/http-flv/rtmp/m3u8等直播流播放
  7. Linux下vncviewer和vncserver的安装
  8. sun java studio_Sun Java Studio Enterprise 支持
  9. java如何使用水晶报表_在Windows应用程序中使用水晶报表的方法
  10. JavaWeb面试(二)