当前位置: 首页 > news >正文

2024 CSP-J 题解

2024 CSP-J题解

扑克牌

​ 题目给出了一整套牌的定义,但是纯粹在扯淡,完全没有必要去判断给出的牌的花色和点数,我们用一个循环来依次读入每一张牌,如果这个牌在之前出现过,我们就让答案减一。这里建议用map、unordered_set或者给每一种牌一个编号,然后用数组存储也可以。

#include <bits/stdc++.h>using namespace std;int n;int main()
{map<string, bool> M;int ans = 52;cin >> n;for (int i = 1; i <= n; i++){string tmp;cin >> tmp;if (!M[tmp])ans--, M[tmp] = 1;}cout << ans;return 0;
}

地图探险

​ 纯粹的记忆化搜索,用数组存储对于每一个方向下一步坐标的差值,每次要执行移动操作之前,我们都要不停地执行右转的操作,直到下一步的坐标合法为止。

​ 我们可以开辟一个二维数组来记录每一次搜索经过的位置,每次走到一个之前没走过的位置,我们就让答案加一。

#include <bits/stdc++.h>using namespace std;const int maxn = 1e3 + 5;
int mx[4] = {0, 1, 0, -1}, my[4] = {1, 0, -1, 0}, ans; // mx 和 my 用来存储每一个方向对应的变化值
char Map[maxn][maxn];                                  // 储存整个地图
bool vis[maxn][maxn];                                  // 记录每个地方都有没有被遍历过
int n, m, k, x_0, y_0, d;void dfs(int x, int y, int d)
{if (!vis[x][y]) // 如果这个位置还没有走过,就让答案加一ans++;vis[x][y] = 1;int X = x + mx[d], Y = y + my[d];                                   // 下一步要走的位置while ((X < 1 || X > n || Y < 1 || Y > m || Map[X][Y] == 'x') && k) // 下一步不合法,并且还需要执行操作,那么我们右转d = (d + 1) % 4, k--, X = x + mx[d], Y = y + my[d];             // k 一定要减一if (k == 0)                                                         // 后面没有操作要进行了return;k--;dfs(X, Y, d); // 移动到下一步
}void solve()
{cin >> n >> m >> k;cin >> x_0 >> y_0 >> d;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> Map[i][j];dfs(x_0, y_0, d);cout << ans << '\n'; // 因为多组样例,这几行都是清空的操作ans = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)vis[i][j] = 0;
}int main()
{int T;cin >> T;while (T--){solve();}return 0;
}

小木棍

​ 数学(dabiao)题,可以先简单找找规律。

​ 首先对于 0~9 每一种数字,如果要用火柴拼出来的话,他们分别需要 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 根木条。根据数据范围,我们可以得到一点提示,这题反正是跟 7 脱不了关系。

​ 其次有一个很显而易见的道理,因为 8 这个数字需要的火柴最多,整个数字的长度就越短,也就越小,那么当 n 是 7 的倍数时,那么 ( n / 7 ) (n / 7) (n/7) 个 8 组成的数字就是最小的。

除此之外:

如果 n % 7 = 1:

​ 因为一根火柴什么数字都拼不出来,所以需要去牺牲从前往后第二个数字来凑出一个数来(想不出来可以打表)。结果就是 10 + 很多个 8。

​ 但是需要特判 n = 1 的时候,结果是 -1。

如果 n % 7 = 2:

​ 两根火柴可以组成一个 1,后面全部填 8。

如果 n % 7 = 3:

​ 需要特判 n = 3 和 n = 10,答案分别是 7 和 22,其他情况,答案是 200 + 很多个 8。

如果 n % 7 = 4:

​ 特判 n = 4,答案是 4,其他情况答案是 20 + 很多个 8。

如果 n % 7 = 5:

​ 结果是 2 + 很多个 8。

如果 n % 7 = 6:

​ 结果是 6 + 很多个 8。

#include <bits/stdc++.h>using namespace std;int n, T;int main()
{cin >> T;while (T--){cin >> n;int type = n % 7;if (type == 0){for (int i = 1; i <= n / 7; i++)cout << 8;cout << '\n';continue;}if (type == 1){if (n == 1)cout << -1 << '\n';else{cout << 10;for (int i = 1; i <= n / 7 - 1; i++)cout << 8;cout << '\n';}continue;}if (type == 2){cout << 1;for (int i = 1; i <= n / 7; i++)cout << 8;cout << '\n';continue;}if (type == 3){if (n == 3)cout << 7 << '\n';else if (n == 10)cout << 22 << '\n';else{cout << 200;for (int i = 1; i <= (n - 17) / 7; i++)cout << 8;cout << '\n';}continue;}if (type == 4){if (n == 4)cout << 4 << '\n';else{cout << 20;for (int i = 1; i <= (n - 11) / 7; i++)cout << 8;cout << '\n';}continue;}if (type == 5){cout << 2;for (int i = 1; i <= (n - 5) / 7; i++)cout << 8;cout << '\n';continue;}if (type == 6){cout << 6;for (int i = 1; i <= (n - 6) / 7; i++)cout << 8;cout << '\n';continue;}}return 0;
}

​ 这种题目一般建议还是先打个表找找规律,或者直接写一个暴力看看比较小的数据点的答案。例如这个题目,可以先写一个 10 的某次方的暴搜,枚举每一位是多少。

接龙

​ 这里我没有想到特别简单的思路,要么就是空间不太正确,要么就是时间不太正确,目前的做法是 dp + 差分前缀和。

​ 我们预处理出 100 轮每一轮的答案,然后做个离线的输出,我们把所有的询问按照从小到大的顺序进行排序,因为预处理的时候我们是按照轮数从小到大的顺序进行 d p dp dp 的,所以我们直接把答案全部记录下来就可以。

​ 然后就是 d p dp dp 状态的设计,首先 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示第 i 轮以元素 j 为结尾的答案。但是这里因为第 i 轮的答案只与前一轮有关,所以我们可以把 d p dp dp 的前一个状态去掉,用两个 d p dp dp 数组轮流使用就可以了。

​ 因为在接龙的时候,当前这一轮的人不能和上一轮一样,所以我们重新设计一下状态, dp[j] 表示当前这一轮以元素 j 结尾。

d p [ j ] = − 2 dp[j] = -2 dp[j]=2:当前这一轮以 j 结尾,没人能完成接龙;

d p [ j ] = − 1 dp[j] = -1 dp[j]=1:当前这一轮以 j 结尾,有两个人能完成接龙,根据题意,如果有两个人能完成接龙(使用的句子开头和结尾相同),那么接龙就一定可以完成,所以我们只用考虑两个人的情况就可以了,两个人以上不用考虑;

d p [ j ] = i dp[j] = i dp[j]=i(i 大于 0):当前这一轮以 j 结尾,并且只有一个人能完成接龙,这个人的编号是 i i i

状态转移方程:

​ 对于每一个人 i 遍历所有的 S i , j S_{i,j} Si,j (第 i i i 个人的词库里面的第 j j j 个字符),当发现上一轮 d p [ S i , j ] dp[S_{i, j}] dp[Si,j] 不等于 − 2 -2 2 且不等于 i i i 的时候(连续的两轮不能是同一个人),说明这个数后面的 k 个元素,可以在当前这一轮作为的最后一个元素完成接龙,因为是连续的一个区间,所以这里我们使用差分来进行维护,然后我们再进行前缀和,这样就可以看出来有哪些元素可以完成接龙了(对于 i i i 这一个人来说),把找出来的元素的 d p dp dp 值赋成 i i i

​ 然后我们再去处理其他人,如果发现有一个元素已经被赋值了,说明有两个或者两个以上的人可以使用这个元素作为结尾完成这一轮接龙, d p dp dp 值就是 -1。

#include <bits/stdc++.h>using namespace std;
using ll = long long;void solve()
{int n, k, q;cin >> n >> k >> q;vector<vector<int>> g(n); // 存储所有的 Svector<int> len(n); // 每个 S 对应的长度int maxn = -1;bool flag = false; // 如果没有 1,说明完全没有可能接龙,直接寄for (int i = 0; i < n; i += 1){cin >> len[i];g[i].resize(len[i]);for (int j = 0; j < len[i]; j += 1){cin >> g[i][j];maxn = max(maxn, g[i][j] + 1);if (g[i][j] == 1 && j != len[i] - 1)flag = true;}}vector<tuple<int, int, int>> a(q); // 储存询问int idx = 0, ma = 0;for (auto &[r, c, id] : a){cin >> r >> c;ma = max(ma, r);id = idx++;}idx = 0;sort(a.begin(), a.end()); // 按照轮数从小到大的顺序排列vector<int> ans(q); // 答案vector<int> dp(maxn, -2); // 先全部赋值成 -2,表示不能以 j 为结尾完成这一轮dp[1] = -1;vector<int> now(200000); // 差分数组for (int round = 1; round <= ma && flag; round += 1){vector<int> dp1(maxn, -2); // 当前这一轮的 dp 值for (int i = 0; i < n; i += 1) // 枚举第几个人{for (int j = 0; j < len[i]; j++) // 初始化now[j] = 0;for (int j = 0; j < len[i] - 1; j += 1) {int x = g[i][j];if (dp[x] != -2 && dp[x] != i) // dp 是上一轮的结果,如果 x 可以作为接龙的结尾,那么后面 k 个也可以 {int to = j + k; // 差分now[j + 1] += 1;if (to < len[i])now[to] -= 1;}}for (int j = 1; j < len[i]; j += 1){int x = g[i][j];now[j] += now[j - 1]; // 前缀和if (now[j] != 0 && dp1[x] != -1) // 如果这个数字被差分标记了并且没有两个以上的人标记了这个元素(如果是 -1 就不用管了){if (dp1[x] == -2)dp1[x] = i;else if (dp1[x] != i) // 已经有别人标记过了dp1[x] = -1;}}}while (idx < q) // 给每一个询问提供一个答案{auto &[r, c, id] = a[idx];if (r != round)break;else{if (c >= maxn || dp1[c] == -2)ans[id] = 0;elseans[id] = 1;idx += 1;}}dp = dp1;}for (int i = 0; i < q; i += 1) // 离线输出结果cout << ans[i] << "\n";
}
int main()
{   ios::sync_with_stdio(0); // 怕被卡,关流一下 cin.tie(0);int t;cin >> t;while (t--){solve();}return 0;
}




作者能力有限,如果有任何错误之处,还请各位指教。

相关文章:

2024 CSP-J 题解

2024 CSP-J题解 扑克牌 ​ 题目给出了一整套牌的定义&#xff0c;但是纯粹在扯淡&#xff0c;完全没有必要去判断给出的牌的花色和点数&#xff0c;我们用一个循环来依次读入每一张牌&#xff0c;如果这个牌在之前出现过&#xff0c;我们就让答案减一。这里建议用map、unorde…...

GPU 服务器厂家:中国加速计算服务器市场的前瞻洞察

科技的飞速发展&#xff0c;让 GPU 服务器在加速计算服务器领域的地位愈发凸显。中国加速计算服务器市场正展现出蓬勃的生机&#xff0c;而 GPU 服务器厂家则是这场科技盛宴中的关键角色。 从市场预测的趋势来看&#xff0c;2023 年起&#xff0c;中国加速计算服务器市场便已展…...

Hadoop集群修改yarn队列

1.修改默认的default队列参数 注意&#xff1a; yarn.scheduler.capacity.root.队列名.capacity总和不能超过100 <property><name>yarn.scheduler.capacity.root.queues</name><value>default,hive,spark,flink</value><description>The…...

【GPIO】2.ADC配置错误,还是能得到电压数据

配置ADC功能时&#xff0c;GPIO引脚弄错了&#xff0c;P1写成P2&#xff0c;但还是配置成功&#xff0c;能得到电压数据。 首先一步步排查&#xff1a; 既然引脚弄错了&#xff0c;那引脚改为正确的引脚&#xff0c;能得到数据通过第一步判断&#xff0c;GPIO配置似乎是不起作…...

css-元素居中方式

<section class"wrapper"><div class"content">Content goes here</div> </section>1. 使用 Flexbox Flexbox 是一种现代的布局方法&#xff0c;可以轻松实现居中。 .wrapper {display: flex; /* 使用 Flexbox …...

redis内存打满了怎么办?

1、设置maxmemory的大小 我们需要给 Redis设置maxmemory的大小&#xff0c;如果不设置的话&#xff0c;它会受限于系统的物理内存和系统对内存的管理机制。 2、设置内存的淘汰策略 内存的淘汰策略分为 8 种&#xff0c;从淘汰范围来说分为从所有的key中淘汰和从设置过期时间…...

决策算法的技术分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)第一层级:分层状态机、分层决策树的想法(三个臭皮匠胜过一个诸葛亮)基于场景的固定规则化的分层决策核心思想(2)第二层级:数据管理的方…...

【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥&#xff0c;感谢大哥&#xff1a;https://blog.csdn.net/weixin_43498642/article/details/136896338 【任务目标】 工作需要想更方便地下载汽车之家某车系配置清单&#xff1b;&#xff08;垃圾汽车之家不给下载导出表格&#xff0c;配置页叉掉了车系要出来还要重新…...

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制 JVM&#xff08;Java虚拟机&#xff09;是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展&#xff0c;如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …...

NumPy学习第九课:字符串相关函数

前言 各位有没有注意到&#xff0c;NumPy从第八课开始其实基本上都是讲的是NumPy的函数&#xff0c;而且其实就是各种函数的调用&#xff0c;因为NumPy是一个很强大的函数库&#xff0c;这对我们以后再处理项目中遇到的问题时会有很大的帮助。我们将常用的函数进行一个列举&am…...

卷积神经网络(CNNs)在处理光谱特征的序列属性时表现不佳

卷积神经网络&#xff08;CNNs&#xff09;在处理光谱签名的序列属性时表现不佳&#xff0c;主要是由于其固有网络架构的局限性。具体原因如下&#xff1a; 局部感受野&#xff08;Local Receptive Field&#xff09;&#xff1a; CNN 的核心操作是卷积&#xff0c;它利用局部感…...

【IC】MCU的Tick和晶振频率

Tick 是指 MCU 内部时钟的一个周期&#xff0c;通常表示为一个固定的时间间隔。每个 tick 代表一个时间单位&#xff0c;通常以毫秒&#xff08;ms&#xff09;或微秒&#xff08;μs&#xff09;为单位。Tick 通常由 MCU 的定时器或计时器生成&#xff0c;作为系统时钟的一部分…...

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…...

【STM32 Blue Pill编程实例】-OLED显示DS18B20传感器数据

OLED显示DS18B20传感器数据 文章目录 OLED显示DS18B20传感器数据1、DS18B20介绍2、硬件准备及接线3、模块配置3.1 定时器配置3.2 DS18B20传感器配置3.3 OLED的I2C接口配置4、代码实现在本文中,我们将介绍如何将 DS18B20 温度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL …...

STM32 从0开始系统学习3 启动流程

目录 写在前面 速通&#xff1a;做了什么&#xff1a; 分析I&#xff1a;分析2011年的startup文件所作 分析II&#xff1a;分析2017年的startup文件所作 Helps 2011 2017 Reference 写在前面 请各位看官看本篇笔记的时候首先了解一下计算机体系架构&#xff0c;了解基本…...

交换机:端口安全与访问控制指南

为了实现端口安全和访问控制&#xff0c;交换机通常通过以下几种机制和配置来保护网络&#xff0c;防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…...

【C++ | 数据结构】八大常用排序算法详解

1. 排序的稳定性 排序是我们生活中经常会面对的问题&#xff0c;小朋友站队的时候会按照从矮到高的顺序排列&#xff1b;老师查看上课出勤情况时&#xff0c;会按照学生的学号点名&#xff1b;高考录取时&#xff0c;会按照成绩总分降序依次录取等等。那么对于排序它是如何定义…...

Oracle 第7章:数据完整性约束

在Oracle数据库中&#xff0c;数据完整性是指确保存储在数据库中的数据的正确性和一致性。为了实现这一点&#xff0c;Oracle提供了多种机制来维护数据完整性&#xff0c;包括主键&#xff08;Primary Key&#xff09;、外键&#xff08;Foreign Key&#xff09;和唯一性约束&a…...

【核心】静态/动态全覆盖路径规划相关技术研究

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、明确覆盖式路径的目标二、静态/动态全覆盖路径规划相关技术研究(1)静态全覆盖路径规划方法一:波前WaveFront 覆盖算法方法二:图形学映射算…...

Java 实现集成 Google 邮箱第三方登录实践

文章目录 前言前期准备配置客户端 ID 和重定向 URL配置 OAuth 权限请求页面 登录流程前端演示代码后端演示代码 总结个人简介 前言 Google OAuth 2.0 是其中一种常见的第三方登录方式&#xff0c;广泛应用于各类网站和应用程序。通过 Google OAuth 2.0&#xff0c;用户可以使用…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...