第十五届蓝桥杯JavaB组

十五届蓝桥杯

A.报数游戏 5 分

【问题描述】

小蓝和朋友们在玩一个报数游戏。由于今年是 2024 年,他们决定要 从小到大轮流报出是 20 或 24 倍数的正整数。前 10 个被报出的数是: 20, 24, 40, 48, 60, 72, 80, 96, 100, 120。请问第 202420242024 个被报出的数是多少?

【答案提交】

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

【思路】

第十个数除去第三位,又回到了20,可以得出,这是一个循环,因此循环的次数乘十,加上第几个数即为答案

【代码】

#include <iostream>

int main() {
   int tmp[10] = {20, 24, 40, 48, 60, 72, 80, 96, 100, 120};
       long long sum=202420242024;
       long long x=sum/10;
       int y=sum%10;

    printf("%lld",tmp[y-1]+120*x);
    return 0;
}

B: 类斐波那契循环数 5分

【问题描述】

对于一个有 n 位的十进制数 N = d1 d2 d3 . . . dn,可以生成一个类斐波那契数 列 S,数列 S 的前 n 个数为 {S 1 = d1 S 2 = d2, S 3 = d3, . . . , S n = dn},数列 S 的 第 k(k > n) 个数为 ∑k−1 i=k−n S i。如果这个数 N 会出现在对应的类斐波那契数列 S 中,那么 N 就是一个类斐波那契循环数。 例如对于 197,对应的数列 S 为 {1, 9, 7, 17, 33, 57, 107, 197, . . . },197 出现在 S 中,所以 197 是一个类斐波那契循环数。 请问在 0 至 107 中,最大的类斐波那契循环数是多少?

【答案提交】

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

【思路】

把所有位数分割 ,然后就是把前面n位数相加 然后一直推下去

【代码】

import java.util.ArrayList;


public class Main {
   static boolean flag = false;
   public static void main(String[] args) {
       int p =  10000000;
       do {
           String n = String.valueOf(p);
           int s = 0;
           ArrayList<Integer> integers = new ArrayList<>();
           for (int i = 0; i < n.length(); i++) {
               char c = n.charAt(i);
               int e = Character.getNumericValue(c);
               integers.add(e);
               s += e;
           }
           integers.add(s);
           int length = n.length();
           int idx = length+1;
           while (true) {
               if (s == p) {
                   System.out.println(s);
                   flag = true;
                   break;
               }
               if (s > p) break;
               s = 2 * s - integers.get(idx - length-1);
               integers.add(s);
               idx++;
           }
           p--;
       } while (!flag);
   }
}

C: 分布式队列

【问题描述】

小蓝最近学习了一种神奇的队列:分布式队列。简单来说,分布式队列包 含 N 个节点(编号为 0 至 N − 1,其中 0 号为主节点),其中只有一个主节点, 其余为副节点。主/副节点中都各自维护着一个队列,当往分布式队列中添加元 素时都是由主节点完成的(每次都会添加元素到队列尾部);副节点只负责同步 主节点中的队列。可以认为主/副节点中的队列是一个长度无限的一维数组,下 标为 0, 1, 2, 3 . . . ,同时副节点中的元素的同步顺序和主节点中的元素添加顺序 保持一致。 由于副本的同步速度各异,因此为了保障数据的一致性,元素添加到主节 点后,需要同步到所有的副节点后,才具有可见性。 给出一个分布式队列的运行状态,所有的操作都按输入顺序执行。你需要 回答在某个时刻,队列中有多少个元素具有可见性。

【输入格式】

第一行包含一个整数 N,表示节点个数。 接下来包含多行输入,每一行包含一个操作,操作类型共有以下三种: add、sync 和 query,各自的输入格式如下: 1. add element:表示这是一个添加操作,将元素 element 添加到队列中; 2. sync follower_id:表示这是一个同步操作,follower_id 号副节点会从主 节点中同步下一个自己缺失的元素; 3. query:查询操作,询问当前分布式队列中有多少个元素具有可见性。

【输出格式】

对于每一个 query 操作,输出一行,包含一个整数表示答案。 试题C: 分布式队列 4 第十五届蓝桥杯大赛软件赛省赛 Java 大学 B 组

【样例输入】

3

add 1

add 2

query

add 1

sync 1

sync 1

sync 2

query

sync 1

query

sync 2

sync 2

sync 1

query

【样例输出】

0 1 1 3

不会

后续尝试暴力代码

import java.util.Scanner;
public class Main3 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int a=0;
        int[] b=new int[n];
        while(true){
            String s=scanner.next();
            if(s.equals("add")){
                int val=scanner.nextInt();
                a++;
            }else if(s.equals("sync")){
                int val=scanner.nextInt();
                b[val]++;
            }else{
                int min=Integer.MAX_VALUE;
                for(int i=1;i<n;i++){
                    min=Math.min(min,b[i]);
                }
                System.out.println(min);
            }
        }
    }
}

D: 食堂

【问题描述】

S 学校里一共有 a2 个两人寝、a3 个三人寝,a4 个四人寝,而食堂里有 b4 个四人桌和 b6 个六人桌。学校想要安排学生们在食堂用餐,并且满足每个寝室 里的同学都在同一桌就坐,请问这个食堂最多同时满足多少同学用餐?

【输入格式】

采用多组数据输入。 输入共 q + 1 行。 第一行为一个正整数 q 表示数据组数。 后面 q 行,每行五个非负整数 a2,a3,a4,b4,b6 表示一组数据。

【输出格式】

输出共 q 行,每行一个整数表示对应输入数据的答案。

【样例输入】

2

3 0 1 0 1

0 2 2 1 1

【样例输出】

6 10

【思路】

暴力,模拟(不知道多少分,毕竟我菜)

【代码】

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		while ((n--) != 0) {
			int a2 = scanner.nextInt();
			int a3 = scanner.nextInt();
			int a4 = scanner.nextInt();
			int b4 = scanner.nextInt();
			int b6 = scanner.nextInt();
			int sum = 0;

			if (b6 != 0) {
				if (a2 != 0 && b6 != 0) {
					while (a2 != 0 && b6 != 0)
						b6--;
					a2 -= 3;
					sum += 6;
				} else if (a3 != 0 && b6 != 0) {
					while (a3 != 0 && b6 != 0)
						b6--;
					a3 -= 2;
					sum += 6;
				}

				else if (a2 != 0 && a4 != 0 && b6 != 0) {
					while (a2 != 0 && a4 != 0) {
						sum += 6;
						a2--;
						a4--;
					}
				}

				else if (a3 != 0 && b6 != 0) {
					while (a3 != 0 && b6 != 0) {
						sum += 3;
						b6--;
						a3--;
					}
				}

				else if (a2 != 0) {
					while (a2 != 0 && b6 != 0) {
						sum += 2;
						b6--;
						a2--;
					}
				}

				else if (a4 != 0 && b6 != 0) {
					while (a4 != 0 && b6 != 0) {
						sum += 4;
						b6--;
						a4--;
					}
				}
			}

			if (b4 != 0) {
				if (a2 != 0 && b4 != 0) {
					while (a2 != 0 && b4 != 0) {
						b4--;
						a2 -= 2;
						sum += 4;
					}

				} 
				else if (a4 != 0 && b4 != 0) {
					while (a4 != 0 && b4 != 0) {
						sum += 4;
						b4--;
						a4--;
					}
				}

				else if (a3 != 0 && b4 != 0) {
					while (a3 != 0 && b4 != 0) {
						sum += 3;
						b4--;
						a3--;
					}
				}

			}
			System.out.println(sum);
		}

	}
}

后面发现应该跟去年飞机一样的用dfs

E: 最优分组

【问题描述】

小蓝开了一家宠物店,最近有一种 X 病毒在动物之间进行传染,小蓝为了 以防万一打算购买测试剂对自己的宠物进行病毒感染测试。为了减少使用的测 试剂数目,小蓝想到了一个好方法:将 N 个宠物平均分为若干组,使得每组恰 好有 K 只宠物,这样对同一组的宠物进行采样并混合后用一个试剂进行检测, 如果测试结果为阴性则说明组内宠物都未感染 X 病毒;如果是阳性的话则需要 对组内所有 K 只宠物单独检测,需要再消耗 K 支测试剂(当 K = 1 时,就没 必要再次进行单独检测了,因为组内只有一只宠物,一次检测便能确认答案)。 现在我们已知小蓝的宠物被感染的概率为 p,请问 K 应该取值为多少才能 使得期望的测试剂的消耗数目最少?如果有多个答案输出最小的 K。

【输入格式】

第一行,一个整数 N。 第二行,一个浮点数 p。

【输出格式】

输出一行,一个整数 K 表示答案。

【样例输入】

1000

0.05

【样例输出】

5

【思路】

数学题

【代码】

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();
        double p= scanner.nextDouble();
        int desk=1;
        double mintext=Double.MAX_VALUE;
        for (int i = 0; i < N; i++) {
            double exct=Math.pow(1.0-p,i);
            double exctGuop=1.0+(1.0-exct)*i;
            double exctTotal=(double)N/i*exctGuop;
            if (exctTotal<mintext){
                mintext=exctTotal;
                desk=i;
            }
        }
        System.out.println(desk);

    }
}

试题 G: LITS 游戏

题目

俄罗斯方块是一款风靡全球的游戏,在游戏中有多种方格图案,我们只关
注这四个经典的方块图案:LITS,如下图所示:

在这里插入图片描述
LITS 这四种方块都是由四个相同大小的小方块组成的。
现在给出一副大小为 N × N 的格子图,每个格子上都有一个数字 0/1,如
果格子处的数字为 1 说明这个格子上有一个小方块,数字为 0 则没有。
你需要判断从这个格子图上是否可以找出 LITS 四个方块图案(每个方
块图案之间都是独立的,不存在不同的图案公用同一个小方块的情况)。其中
LITS 方块的形状旋转任意个 90 度都是合法的,但不允许翻转。

输入格式

第一行一个整数 T,表示有 T 组数据。
每组数据的第一行包含一个整数 N,表示格子图大小。
接下来输入 N 行,每行 N 个值为 0/1 的整数,表示格子布局。

输出格式

对于每组数据,输出一行包含一个字符串。如果此组数据满足题意则输出
“Yes”,否则输出 “No”。

样例输入

2
5
1 1 1 1 1
1 0 1 1 0
1 0 0 0 1
1 0 1 0 1
1 1 1 1 1
5
1 0 0 1 1
1 1 1 1 1
1 1 1 1 0
1 1 1 0 1
0 1 1 1 1

样例输出

No
Yes

不会,直接暴力

试题 H: 拼十字

问题描述

在 LQ 国神秘的古老森林,有一座被称为 “拼十字” 的神秘遗迹。据传,
“拼十字” 是由古代文明建造的,它是一个巨大的石头结构,由两个巨大的矩形
交叉叠放在一起,形成了一个庄严而神秘的十字形状。这个遗迹被认为是连接
人类和神灵之间的通道,拥有神秘的力量和能量。
在这里插入图片描述
现在给出 N 个矩形,其中第 i 个矩形的长度和宽度分别问 li,wi,并且矩
形颜色 ci 为红 (0)/黄 (1)/蓝 (2) 中的一种。现在小蓝想知道在这 N 个矩形中有
多少对矩形可以 “拼十字”?
两个矩形可以“拼十字”的充要条件是:

  1. 两个矩形的颜色不同;
  2. 矩形 1 的长度严格大于矩形 2 的长度并且矩形 1 的宽度严格小于矩形 2
    的宽度。
    注意,矩形长度和宽度属性是固定的,是不可以通过旋转矩形而发生转变
    的。

【输入格式】

第一行一个整数 N,表示有 N 个矩形。
接下来 N 行,每行输入三个整数 l、w、c 表示一个矩形的长、宽和颜色。

【输出格式】

输出一个整数表示答案。由于答案可能会很大,所以你需要将答案对
109 + 7 取模之后输出。

【样例输入】

5
1 10 0
6 6 0
8 6 1
6 10 0
1 2 1

【样例输出】

2

不会

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值