第15届蓝桥杯国赛JavaA组个人题解

最后两个概率题不会做, 50分没了
博弈论交了暴力, 30%的分
赛后hack了自己1个填空和一个15分的题
算下来应该是66分, 喜提国一最后一名, rank11

A 田字与直线

题目:

9个点按3*3排成矩阵状, 求恰好经过其中2个点的直线个数

答案

过角的: 4个角, 每个2条

不过角: 4个中点, 4条

ans = 12

B 传送阵

题目

42个传送阵, 长度为42的排列a

第i个传送阵会传送到a[i]

每天执行一次传送, 求 恰好2024天一循环的排列方案数, 模1e9+7

如: 3个传送阵

1 → 2 、 2→3 、3→1, 每3天一循环

1→ 1 、2→3、3→2, 每2天一循环

思路

设 42个传送阵分为k个连通块, 第i个连通块大小为a[i]

则有
l c m ( a [ i ] ) = 2024 ∑ a [ i ] = 42 lcm(a[i])=2024\\ \sum{a[i]}=42 lcm(a[i])=2024a[i]=42
枚举连通块个数k, 然后dfs剪枝枚举每一个连通块大小

对于大小为size的块来说, 可形成的不同的环的数量为 A(size-1)

对于枚举的块大小序列(升序): a1,a2…ak
方案数 = C 42 a 1 A a 1 − 1 ∗ C 42 − a 1 a 2 A a 2 − 1 ∗ . . . C 42 − . . . a k A a k − 1 方案数 = C_{42}^{a_1}A_{a_1-1}*C_{42-a_1}^{a_2}A_{a_2-1}*...C_{42-...}^{a_k}A_{a_k-1} 方案数=C42a1Aa11C42a1a2Aa21...C42...akAak1

代码(仅供参考)

此代码非赛时代码, 赛时代码被我hack了

import java.util.*;public class Main {static int k;// 连通块个数static int[] arr = new int[50];// 搜索结果, arr[i]:连通块i的大小, 内部全排列static long ans = 0;static int MOD = 10_0000_0007;static long[] A = new long[50];// 阶乘(排列数)static {A[1] = 1;for (int i = 2; i < 50; i++) {A[i] = A[i - 1] * i % MOD;}}public static void main(String[] args) {for (k = 2; k < 42; k++) {Arrays.fill(arr, 0);dfs(0, 1, 1);}System.out.println(ans);//151495483}static long[][] C = new long[50][50];static {for (int i = 0; i < 50; i++) {C[i][0] = 1;}for (int i = 1; i < 50; i++) {for (int j = 1; j < 50; j++) {C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;}}}static void dfs(int sum, int i, long lcm) {if (sum == 42 && i == k + 1) {if (lcm == 2024) {long res = 1;int m = 42;for (int j = 1; j <= k; j++) {res = res * C[m][arr[j]] % MOD * A[arr[j] - 1] % MOD;m -= arr[j];}ans = (ans + res) % MOD;}return;}if (sum >= 42 || i >= k + 1 || lcm >= 2024) return;//剪枝for (int a = Math.max(1, arr[i - 1]); a + sum <= 42; a++) {// 枚举第i位(块大小升序)arr[i] = a;dfs(sum + a, i + 1, lcm(lcm, a));arr[i] = 0;}}static long gcd(long a, long b) {if (b == 0) return a;return gcd(b, a % b);}static long lcm(long a, long b) {return (a * b) / gcd(a, b);}}

C 进制转换

题目

给出n组数, 第i组位A[i],B[i]

A可能是2,4,8,16中的一种, B是一个十进制数, A转为10进制不超过B

求 A的唯一十进制, 如果没有 或 解不唯一则输出-1

思路

try Integer.parseInt

代码

import java.io.*;public class Main {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);static StreamTokenizer st = new StreamTokenizer(bf);static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static int I() throws IOException {st.nextToken();return (int) st.nval;}static String S() throws IOException {String res = bf.readLine();while (res.isEmpty()) res = bf.readLine();return res;}/*21010 23A1 160*/public static void main(String[] args) throws IOException {int n = I();for (int i = 0; i < n; i++) {String[] op = S().split(" ");pw.println(solve(op[0], Long.parseLong(op[1])));}pw.flush();}static int[] JZ = new int[]{2, 4, 8, 16};static long solve(String A, long B) {long ans = -1;for (int jz : JZ) {long r = change(A, jz);if (r > B) continue;if (r != -1) {if (ans != -1) return -1;ans = r;}}return ans;}static long change(String A, int jz) {try {return Long.parseLong(A, jz);} catch (Exception e) {return -1;}}
}

D 栈

题目

n个数依次入栈, 如果数已存在栈中, 则取出放栈顶

每放入一个数, 需要输出栈中相邻数字之和为奇数的组数

思路

双向链表 + 哈希表 进行模拟

哈希表通过key拿到Node对象, 把Node对象从链表中移除, 再添加到末尾

期间维护相邻数字之和为奇数的组数, 取数放数时只有相邻的那几个数字是否和为奇会改变

代码

import java.io.*;
import java.util.*;public class Main {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);static StreamTokenizer st = new StreamTokenizer(bf);static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static int I() throws IOException {st.nextToken();return (int) st.nval;} /*
4
1 2 3 2*/public static void main(String[] args) throws IOException {int n = I();HashMap<Integer, Node> map = new HashMap<>();//val->nodeint ans = 0;for (int i = 0; i < n; i++) {int v = I();if (map.containsKey(v)) {Node node = map.get(v);if (node.pre != head && isOdd(node.pre.val + node.val)) {ans--;}if (node.next != head && isOdd(node.val + node.next.val)) {ans--;}if (node.pre != head && node.next != head && isOdd(node.pre.val + node.val + node.next.val)) {ans++;}remove(node);addLast(node);if (node.pre != head && isOdd(node.pre.val + node.val)) {ans++;}} else {Node node = new Node(v);addLast(node);if (node.pre != head && isOdd(node.pre.val + node.val)) {ans++;}map.put(v, node);}pw.println(ans);}pw.flush();}static boolean isOdd(int x) {return (x & 1) == 1;}static Node head = new Node(-1);//哨兵头节点static {head.next = head;head.pre = head;}static class Node {int val;Node pre, next;public Node(int val) {this.val = val;}}static void addLast(Node node) {Node last = head.pre;node.pre = last;node.next = head;head.pre = node;last.next = node;}static void remove(Node node) {Node pre = node.pre, next = node.next;pre.next = next;next.pre = pre;}
}

E 修改数位

题目

给出一个数串a, 可以随意修改数位, 代价为 数字差abs(原数-修改数)

问修改使得数串存在一个子串为0~9的排列的最小代价

(修改前后数串首位不能为0)

思路

枚举

代码(仅供参考)

此代码非赛时代码, 赛时代码被我hack了

import java.io.*; public class Main {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);static String S() throws IOException {String res = bf.readLine();while (res.isEmpty()) res = bf.readLine();return res;}
/*
1023456789    0
2023456789    1
9123456782    2
21123456785   5
55555555555   25*/public static void main(String[] args) throws IOException {char[] s = S().toCharArray();int n = s.length;int[] count = new int[10];int ans = 0x3f3f3f3f;for (int i = 1; i + 9 < n; i++) {Arrays.fill(count, 0);for (int j = i; j < i + 10; j++) {count[s[j] - '0']++;}int op = 0;for (int j = 0; j < 9; j++) {op += getOp(count, j, 1);}ans = Math.min(ans, op);}// 首位特判for (int k = 1; k <= 9; k++) {int op = Math.abs(s[0] - '0' - k);// 后9位, 不要k的操作次数Arrays.fill(count, 0);for (int i = 1; i <= 9; i++) {count[s[i] - '0']++;}for (int j = 0; j <= 9; j++) {if (j == k) {op += getOp(count, j, 0);} else {op += getOp(count, j, 1);}}ans = Math.min(ans, op);}System.out.println(ans);}private static int getOp(int[] count, int j, int x) {if (count[j] == x) return 0;int t = Math.abs(count[j] - x);if (count[j] > x) {count[j + 1] += t;// 移到j+1} else {count[j + 1] -= t;// 从j+1移来}return t;}
}

F 文本编辑

题目

操作:

(1) 光标左/右移动n位

(2) 光标前插入字符串

(3) 删除光标前/后字符n个

求操作后的文本

思路

两个栈模拟

代码

import java.io.*;
import java.util.*; public class Main {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);static StreamTokenizer st = new StreamTokenizer(bf);static int I() throws IOException {st.nextToken();return (int) st.nval;}static String S() throws IOException {String res = bf.readLine();while (res.isEmpty()) res = bf.readLine();return res;}public static void main(String[] args) throws Exception {int n = I();LinkedList<Character> pre = new LinkedList<>(), next = new LinkedList<>();for (int i = 0; i < n; i++) {String op = S();char type = op.charAt(0);int len = op.length();if (type == 'i') {//插入文本// 格式 insert "xxx"String text = op.substring(8, len - 1);for (char ch : text.toCharArray()) {pre.addLast(ch);}} else if (type == 'd') {//删除文本// 格式 dxxxh 或 dxxxlchar t = op.charAt(len - 1);int num = Integer.parseInt(op.substring(1, len - 1));if (t == 'h') {for (int k = 0; k < num && !pre.isEmpty(); k++) {pre.pollLast();}} else {for (int k = 0; k < num && !next.isEmpty(); k++) {next.pollFirst();}}} else {//移动光标// 格式 xxxh 或 xxxlchar t = op.charAt(len - 1);int num = Integer.parseInt(op.substring(0, len - 1));if (t == 'h') {for (int k = 0; k < num && !pre.isEmpty(); k++) {next.addFirst(pre.pollLast());}} else {for (int k = 0; k < num && !next.isEmpty(); k++) {pre.addLast(next.pollFirst());}}}}StringBuilder ans = new StringBuilder();for (char ch : pre) ans.append(ch);for (char ch : next) ans.append(ch);System.out.println(ans);}
}

G 异或博弈

题目

从长度为n的数组a中取2个数字, A希望数字异或尽可能大, B希望尽可能小

问, A先选, B后选, 异或为多少? B先选,A后选,异或为多少?

思路

0/1字典树

A先选: 枚举A的选择vA, 从字典树上移除vA, B希望尽可能小, 所以vB从高位开始应该尽可能与vA相同, 在树上查找即可

B先选: 同理,枚举vB, 移除vB, A希望尽可能大, 就要与vB相反

(没时间了, 没码出来, 交了暴力的30%)

代码(仅供参考)

import java.io.*; public class Main {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);static StreamTokenizer st = new StreamTokenizer(bf);static int I() throws IOException {st.nextToken();return (int) st.nval;}/*
4
2 3 5 6A选6, B需要最小选5, 最小为110^101=3
B选6, A需要最大选3, 最大为110^011=5
输出 3 5*/public static void main(String[] args) throws Exception {int n = I();int[] a = new int[n];Tree tree = new Tree();for (int i = 0; i < n; i++) {a[i] = I();tree.add(a[i]);}//打表(a);int ansAB = Integer.MIN_VALUE, ansBA = Integer.MAX_VALUE;int vA, vB;for (int i = 0; i < n; i++) {// A先选,B后选vA = a[i];tree.remove(vA);vB = tree.find(vA);ansAB = Math.max(ansAB, vA ^ vB);tree.add(vA);//System.out.println("A选" + vA + " B选" + vB + " 最小为" + (vA ^ vB));// B先选,A后选vB = a[i];tree.remove(vB);vA = tree.find(~vB);ansBA = Math.min(ansBA, vA ^ vB);tree.add(vB);//System.out.println("B选" + vB + " A选" + vA + " 最大为" + (vA ^ vB));}System.out.println(ansAB + " " + ansBA);}static void 打表(int[] a) {int n = a.length;int ansAB = Integer.MIN_VALUE, ansBA = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {// vAB:A已选定,由B选,B需要选一个最小的// vBA:B已选定,由A选,A需要选一个最大的int vAB = Integer.MAX_VALUE, vBA = Integer.MIN_VALUE;for (int j = 0; j < n; j++) {if (j == i) continue;int v = a[i] ^ a[j];vAB = Math.min(vAB, v);vBA = Math.max(vBA, v);}System.out.println("A选" + a[i] + " B最小 " + vAB);System.out.println("B选" + a[i] + " A最大 " + vBA);ansAB = Math.max(ansAB, vAB);// A从选择的结果里选最大结果ansBA = Math.min(ansBA, vBA);// B从选择的结果里选最小结果}System.out.println(ansAB + " " + ansBA);}static class Tree {static class Node {int cnt = 0;Node zero, one;}Node root = new Node();void add(int v) {Node p = root;for (int i = 31; i >= 0; i--) {int bit = (v >>> i) & 1;if (p.zero == null) p.zero = new Node();if (p.one == null) p.one = new Node();p = bit == 0 ? p.zero : p.one;p.cnt++;}}void remove(int v) {Node p = root;for (int i = 31; i >= 0; i--) {int bit = (v >>> i) & 1;if (p.zero == null) p.zero = new Node();if (p.one == null) p.one = new Node();p = bit == 0 ? p.zero : p.one;p.cnt--;}}int ans;int find(int v) {//查找最接近v的路径ans = Integer.MAX_VALUE;dfs(root, v, 31, 0);return ans;}void dfs(Node p, int v, int level, int curV) {if (level < 0) {if ((v ^ curV) < ans) ans = curV;//寻找最接近,异或值最小return;}int bit = (v >>> level) & 1;if (bit == 0 && p.zero != null && p.zero.cnt > 0) {dfs(p.zero, v, level - 1, curV);return;}if (bit == 1 && p.one != null && p.one.cnt > 0) {dfs(p.one, v, level - 1, curV + (1 << level));return;}if (p.zero != null && p.zero.cnt > 0) dfs(p.zero, v, level - 1, curV);if (p.one != null && p.one.cnt > 0) dfs(p.one, v, level - 1, curV + (1 << level));}}
}

H 刷墙

题目

n个墙排成一排, 要刷第i个墙,需要保证i+1~n的已刷墙数为偶数

求方案数, 模1e9+7

思路

打表

n012345678910
方案数111241236144576288014400
转移1*1*1*2*2*3*3*4*4*5*5

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;public class Main {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);static StreamTokenizer st = new StreamTokenizer(bf);static int I() throws IOException {st.nextToken();return (int) st.nval;}static int MOD = 10_0000_0007;public static void main(String[] args) throws Exception {int n = I();int k = 0;for (int i = 0; i < n; i++) k += I();//忽略不用刷的墙long ans = 1;int cnt = 0, mul = 1;for (int i = 0; i < k; i++) {ans = ans * mul % MOD;cnt++;if (cnt == 2) {cnt = 0;mul++;}}System.out.println(ans);}
}

I 斗蛐蛐

题目

n个蛐蛐成环, 第i只的攻击力为a[i], 有a[i]的概率杀死被攻击的蛐蛐

从第1只开始攻击

每次攻击会随机选择左边或右边(概率1/2), 如果杀死则环长度-1

求最后存活是第i只的概率(每只的都要求)

J 合并小球

题目

数轴上n个球, 第i个在x[i], 价值y[i]

每秒每个球都有1/2的概率向右移动一位

如果两球相邻, 左球向右, 右球不动, 则它们会合并为一个球, 新球价值为他们的价值之积

当球移动到T位置, 会被立即收走, 统计价值之和

求价值之和的期望

以上代码有任何问题, 欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

员工转正申请精选12个模板供参考

随着社会在不断地进步&#xff0c;我们会经常使用各种各样的申请书&#xff0c;转正申请书就是申请书的一种&#xff0c;那么转正申请书是怎么写的呢&#xff1f;下面是我收集整理的员工转正申请书几个版本&#xff0c;仅供参考&#xff0c;希望能够帮助到大家。别忘了一键三连…

贵的SSL证书跟便宜的SSL证书有什么不一样的?

目前SSL证书市场上从几十块钱的到上万元的都是有的&#xff0c;那么这些着证书之间有什么不同&#xff1f;怎么收费差这么多&#xff1f; 一&#xff1a;从证书的认证安全等级来说 比较便宜的SSL证书一般都是DV验证级别的。也就是说只验证域名的所有权&#xff0c;做一个DNS解…

楼市去金融化, 教育去资本化 ,医疗去市场化

楼市去金融化&#xff0c; 教育去资本化 &#xff0c;医疗去市场化

03.0docker安装

docker简介 docker的主要目标是"Build,Ship and Run any App,Angwhere",构建&#xff0c;运输&#xff0c;处处运行 部署服务&#xff0c;环境问题 一次构建&#xff0c;处处运行 docker是一种软件的打包技术 构建&#xff1a;做一个docker镜像 运输&#xff1a;do…

数据分析常用模型合集(一)AARRR模型和漏斗模型

准备把常用的数据分析模型&#xff0c;像什么AARRR&#xff0c;RFM之类的&#xff0c;逐个全部写一下&#xff1b; 最好能带点案例和代码&#xff0c;搞一个小合集。 最终达到完全不懂的人&#xff0c;看完就能知道得差不多&#xff1b; 数据分析常用模型合集&#xff08;二…

[大师C语言(第十八篇)]C语言typedef背后技术详解

引言 在C语言中&#xff0c;typedef是一个非常有用的关键字&#xff0c;它允许程序员为现有的数据类型定义一个新的名称。这种做法可以提高代码的可读性和可维护性&#xff0c;特别是在处理复杂的数据结构时。本文将深入探讨C语言typedef背后的技术原理&#xff0c;并通过丰富…

大型语言模型简介

大型语言模型简介 大型语言模型 (LLM) 是一种深度学习算法&#xff0c;可以使用非常大的数据集识别、总结、翻译、预测和生成内容。 文章目录 大型语言模型简介什么是大型语言模型&#xff1f;为什么大型语言模型很重要&#xff1f;什么是大型语言模型示例&#xff1f;大型语…

CPython源码学习3:浮点数对象

浮点数的结构体 PyFloatObject 浮点数的结构体PyFloatObject &#xff0c;定义在头文件 Include/floatobject.h 中&#xff0c;可以看出浮点数底层使用 C 的double类型来存储真正的值。 // Include/floatobject.h typedef struct {PyObject_HEADdouble ob_fval; // 底层使用…

[python][whl]python模块pylibtiff的whl文件所有版本下载地址汇总pylibtiff安装

​ 安装pylibtiff 以前都是访问地址如下https://www.lfd.uci.edu/~gohlke/pythonlibs/#pylibtiff 下载whl文件后直接pip即可&#xff0c;但是这个网站2023年末开始已经停止访问无法访问&#xff0c;不过还好我以前备份过pylibtiff文件&#xff0c;下载地址汇总如下&#xff1a…

(一)django目录介绍

1、生成django项目&#xff0c;得到的目录如下 manage.py&#xff1a;命令行工具&#xff0c;内置多种方式与项目进行交互。在命令提示符窗口下&#xff0c;将路径切换到项目并输入python manage.py help,可以查看该工具的指令信息。 默认的数据库工具&#xff0c;sqlite 在…

基于django | 创建数据库,实现增、删、查的功能

1、在cmd中&#xff0c;输入指令进入mysql终端&#xff1a; mysql -u 用户名 -p 2、输入mysql的密码 3、输入指令&#xff0c;显示出所有的数据库 show databases; 4、输入指令创建表&#xff1a; create table 表名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 5、use …

【Python网络爬虫】详解python爬虫中正则表达式、BeautifulSoup和lxml数据解析

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

【算法】在?复习一下快速排序?

基本概念 快速排序是一种基于交换的排序算法&#xff0c;该算法利用了分治的思想。 整个算法分为若干轮次进行。在当前轮次中&#xff0c;对于选定的数组范围[left, right]&#xff0c;首先选取一个标志元素pivot&#xff0c;将所有小于pivot的元素移至其左侧&#xff0c;大于…

EPIC Fantasy Village - Low Poly 3D Art(梦幻村庄乡村小镇模型)

这个包提供了一个以幻想为主题的多边形风格游戏,适合TopDown、RPG、冒险、社交和RTS。它允许你创建自己的美丽幻想村庄和角色。 EPIC 幻想村庄包 EPIC幻想村庄包提供了一个以幻想为主题的多边形风格游戏,适用于TopDown、RPG、冒险、社交和RTS游戏。这个包允许你创建自己的美丽…

Idefics2-8B多模态大模型微调指南

我们生活在大模型 (LLM) 时代&#xff0c;几乎每周你都会听到一种新的语言模型问世。从谷歌的 Gemini 和 Gemma 模型到 Meta 最新的 Llama 3 和微软的微型 Phi-3 模型&#xff0c;这些行业巨头之间正在进行激烈的在线竞争&#xff0c;以争夺头把交椅。 在这一连串的活动中&…

MySQL全文索引实现简单版搜索引擎

1 前言 只有Innodb和myisam存储引擎能用全文索引(innodb支持全文索引是从mysql5.6开始的)char、varchar、text类型字段能创建全文索引(fulltext index type)全文索引的基于关键词的,如何区分不同的关键词了,就要用到分词(stopword)英文单词用空格,逗号进行分词;中文分…

Java 18新特性深度解析:提升开发效率与性能的革新工具

在Java的世界中&#xff0c;每一次更新都带来新的惊喜和挑战。Java 18作为长期支持版本&#xff0c;不仅延续了Java语言的稳定性和可靠性&#xff0c;还引入了一系列令人兴奋的新特性&#xff0c;旨在进一步提升开发者的生产力和应用程序的性能。本文将深入探讨Java 18中的关键…

css的布局方式

CSS提供了多种布局方式&#xff0c;以满足不同的需求。以下是几种常见的CSS布局方式&#xff1a; 静态布局。网页布局始终按照最初写代码时的布局来显示&#xff0c;不随浏览器尺寸变化而变化。1 自适应布局。屏幕分辨率变化时&#xff0c;页面里元素的大小会变化而布局…

AtCoder Regular Contest 179 (ABC题)视频讲解

A - Partition Problem Statement You are given integers N N N and K K K. The cumulative sums of an integer sequence X ( X 1 , X 2 , … , X N ) X(X_1,X_2,\dots ,X_N) X(X1​,X2​,…,XN​) of length N N N is defined as a sequence Y ( Y 0 , Y 1 , … , …

交互设计如何助力传统技艺在当代复兴?

背景介绍 榫卯是中国传统木工中一种独特的接合技术&#xff0c;它通过构件间的凸凹部分相互配合来实现两个或多个构件的紧密结合。这种结构方式不依赖于钉子或其他金属连接件&#xff0c;而是利用木材自身的特性&#xff0c;通过精巧的设计和工艺&#xff0c;实现构件间的稳定…