前言:
题库链接:https://www.dotcpp.com/oj/train/1118/
本人是javaB组赛道,第一次参加蓝桥杯,做对了三道半题目,分别为A,B,C题,然后最后一题暴力了一遍。
体会:
本人目前在大二下,在大二上一学期听力黑马的数据结构学完了,但是感觉不适合我,主要是知识点较分散,整体联系不起来,导致我学一个忘一个.在寒假换了蓝桥的课学,感觉学的不错,然后TMD
比赛时,感觉几乎没用上,真就纯纯暴力杯....
经验:1. 可以用idea: 我进考场前知道,在门外等着时,看见电脑上有idea,我就问了学长,学长说有的电脑有idea,有的话你直接用,不会判你作弊,甚至填空题你用Excel做也行!!! 当然平时尽量还是用eclipse,防止你运气差电脑上没idea
2. 不用带草稿纸,考试有,笔自带
3. 不要死磕一道题,就如今年的省赛,最后一道题直接简单暴力就能得一半的分,很多人都浪费了这送的分
4.最后20分钟,把不会的题可以直接使用打印语句打印你认为可能的一些样例正确骗点分
最后:同学们心态放平,就看做一场普通比赛,祝同学们轻松拿下.
下面是我写的笔记有需要的踢我一下免费给.
题解:
A:报数游戏
题目:
(简洁版)从小到大排列是20或24倍数的正整数,前10个数依次是:”20 24 40 48 60 72 80 96 100 120“,求第202420242024个数是多少?(填空题)
思路:
从他给出的十个数,我发现一个规律,第一个数为20*1,第二个数为24*1,第三个数为20*2,第四个数为24*2。以此类推,第n个数
假设n为偶数,则 f (n) 应为24的倍数 24 * (n / 2)
假设n为奇数,则 f (n) 应为20的倍数 20 * (n / 2)
我的代码:
public class Main {
public static void main(String[] args) throws IOException {
long n = Long.valueOf("202420242024");
long num = 24;
long result = n*num/2;
System.out.println(result);
}
}
//答案:2429042904288
B:类斐波那契循环数
题目:
如果读懂题意这个题其实就简单。
题目意思:就是有一个数n,n有m位数。
第一步:将n的每位数按顺序填充到数组中
第二步:第m+1个数为前m个数的和
第三步:如果数组出现n,则这个数为题目需要的数
最后求10000000以内符合上面条件的数最大为多少
思路:
我们从10000000到1开始遍历,然后按题意步骤求前缀和,因为该数组为递增,所以当该数
大于n则跳过该循环,直到找到该数等于n就得到答案了。
我的代码:
//答案:7913837
public class Main {
public static void main(String[] args) throws IOException{
int a = 10000000;
for (int i = a; i >0; i--) {
ArrayList<Integer> arr = new ArrayList<>();
//前缀和数组
ArrayList<Integer> sum = new ArrayList<>();
String str = Integer.toString(i);
arr.add(0);
//将前n位补充进集合
for (int j = 0; j < str.length(); j++) {
arr.add(str.charAt(j)-'0');
}
sum.add(0);
//将前n位的前缀和补充进集合
for (int j = 1; j <=str.length() ; j++) {
sum.add(arr.get(j)+sum.get(j-1));
}
//开始递推
int j1 = str.length();
while (arr.get(j1)<i){
arr.add(sum.get(j1)- sum.get(j1-str.length()));
sum.add(arr.get(j1+1)+sum.get(j1));
j1++;
}
if(arr.get(j1)==i){
System.out.println(i);
break;
}
}
}
C:分布式队列
题目:
我的代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//n为有几个元素
int n = sc.nextInt();
//创建长度为n的数组,数组的含义是第i个队列中有几个元素,0下标表示主队列有几个元素
int arr[] = new int[n];
//开始模拟
while(sc.hasNext()) {
//接收需要的操作
String op = sc.next();
switch (op) {
//添加操作
case "add":
arr[0]++;
break;
//同步操作
case "sync":
int index = sc.nextInt();
//如果副队列与主队列数量相等,说明已同步完,副队列没有可同步数据
if(arr[0]==arr[index]) break;
//否则就进行同步
else {
arr[index]++;
break;
}
//查询操作
case "query":
//查询的意思就是,找副队列中最小数量
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
//从0开始,是因为有个细节,当n为一时,只有主队列
min = Math.min(min, arr[i]);
}
System.out.println(min);
}
}
}
}