CSP-J2025 题解

news/2025/11/1 18:43:57/文章来源:https://www.cnblogs.com/dbywsc/p/19183712

拼数

思路

先考虑怎么把数字提取出来,可以拿一个字符串变量存储整个输入,然后遍历这个字符串,如果当前字符是 '0' 到 '9' 就可以通过将它减去 '0' 的方式放到一个整形数组中。

接下来考虑拼出最大的数,显然让这个数组从大到小排序就好了。

代码

void solve(void) {std::string s;std::cin >> s;std::vector<int> num;for(auto i : s) {if(i >= '0' && i <= '9') num.push_back(i - '0');}std::sort(num.begin(), num.end(), std::greater<int>());for(auto i : num) std::cout << i;
}

座位

思路

首先要找到排序后小R是第几个。注意到每个人的分数都是不同的,所以可以先记录一下小R的分数,然后对所有人排序,之后遍历排序后的数组,找到小R的分数就相当于找到了他的排名。

接下来考虑这个排名所在的位置,由于是按列坐的,每列又有 \(n\) 个人,所以第 \(i\) 个人应该在第 \(\lceil i / n \rceil\) 列上。接下来考虑在第几行,注意到奇数列上从上往下排,偶数列是从下往上排。先全部看作从上往下,那么第 \(i\) 个人应该在这一列的第 \(i \bmod n\) 上,需要注意的是如果 \(i \bmod n = 0\) 说明他在这一列的第 \(n\) 个位置。接下来考虑偶数列是从下往上排,只需要将它的位置倒过来就好了,即 \(row = n - row + 1\)

代码

void solve(void) {int n, m;std::cin >> n >> m;std::vector<int> a(n * m + 1);int goal = 0, idx = 0;for(int i = 1; i <= n * m; i++) {std::cin >> a[i];if(i == 1) goal = a[i];}std::sort(a.begin() + 1, a.end(), std::greater<int>());for(int i = 1; i <= n * m; i++) {if(a[i] == goal) {idx = i;break;}}//std::cout << idx << '\n';int col = (idx + n - 1) / n;int row = idx % n;if(row == 0) row = n;if(col % 2 == 0) {row = n - row + 1;}std::cout << col << ' ' << row;
}

异或和

思路

首先需要知道的是,区间异或和是可以用前缀和的方式维护的。所以先维护一个前缀异或和,接下来考虑 DP。

\(f_i\) 是前 \(i\) 个元素中异或和为 \(k\) 的最大不相交区间数量,有边界 \(f_0 = 0\) ,所求答案为 \(f_n\)

考虑怎么转移,有两种情况:

  1. 选了下一个位置后不发生改变,即 \(f_i = f_{i - 1}\)
  2. 选了下一个位置后发生了改变,这就说明当前位置与之前某个区间的异或和为 \(k\) ,设当前区间的异或和为 \(x_i\) ,则要求的某个区间的异或和为 \(x_i \oplus k\) ,如果存在这个结果,就可以从它转移过来。

每次在两种情况中取最大值,因此状态转移方程为:

\[f_i = \left\{\begin{matrix} f_i - 1 \\ \max(f_{i - 1}, f_{x_i \oplus k} + 1) & \text{存在异或和为 $x_i \oplus k$ 的区间} \end{matrix}\right.\]

维护是否存在指定的异或和及其的状态值,可以使用 STL::map 。

代码

void solve(void) {int n, k;std::cin >> n >> k;std::vector<int> a(n + 1);for(int i = 1; i <= n; i++) std::cin >> a[i];std::vector<int> x(n + 1);for(int i = 1; i <= n; i++) {x[i] = x[i - 1] ^ a[i];}std::vector<int> f(n + 1);std::map<int, int> best;best[0] = 0;    //千万注意在map中要初始化边界for(int i = 1; i <= n; i++) {f[i] = f[i - 1];int Xor = x[i] ^ k;auto it = best.find(Xor);if(it != best.end()) {f[i] = std::max(f[i], it->second + 1);}best[x[i]] = std::max(best[x[i]], f[i]);}std::cout << f[n];
}

多边形

思路

一共有 \(n\) 根木棍,那么所有可能的集合数量就为 \(2^n\) ,在这些集合中,我们只需要大小至少为 \(3\) 的集合,数量就为 \(2^n - \binom{n}{0} - \binom{n}{1} - \binom{n}{2}\)

将存边的数组 \(a\) 从小到大排序。对于每一个集合 ,当它的最大边是 \(a_i\) 时,剩余的边一定是由 \(a_1 \cdots a_{i - 1}\) 构成的,设这些边的集合为 \(T\) ,如果当前的集合大小至少为 \(3\) 且不合法,有以下条件:

\[|T| + 1 \geq 3 \Rightarrow |T| \geq 2 \]

\[\sum_{j \in T} a_j + a_i \leq 2 \times a_i \Rightarrow \sum_{j \in T} \leq a_i \]

\(f_i\) 是以 \(i\) 为最大边的不合法子集数量,总的不合法子集数量之和就为 \(\sum_{i = 1}^{n} f_i\)

显然最后的答案就是总集合的数量减去这些不合法集合的数量,考虑用 01背包维护不合法的子集数量。

\(dp_s\) 为当前前缀中和为 \(s\) 的子集数量,有边界 \(dp_0 = 1\) 。接下来考虑转移,对于所有的 \(j \in \{1 \cdots n\}\),有 \(dp_{s} = (dp_{s} + dp_{s - a_i}) \bmod 998244353\) ,显然数组 \(dp\) 的大小应该为所有木棍的值域。

当处理到第 \(i\) 个时,\(\sum_{s = 0}^{a_i}dp_s\) 包含了所有和小于等于 \(a_i\) 的集合数量,我们要删去其中只有一个元素的集合和一个空集,所以\(f_i = (\sum_{s = 0}^{a_i}dp_s - 1 - (i - 1)) \bmod 998244353\)

那么最后的答案就是 \((2^n - \binom{n}{0} - \binom{n}{1} - \binom{n}{2} - \sum_{i = 1}^{n}f_i) \bmod 998244353\)

代码

using i64 = long long;
const int P = 998244353;
void solve(void) {int n; std::cin >> n;std::vector<int> a(n + 1);std::vector<int> p2(5001);p2[0] = 1;for(int i = 1; i <= 5000; i++) p2[i] = p2[i - 1] * 2 % P;for(int i = 1; i <= n; i++) std::cin >> a[i];std::sort(a.begin() + 1, a.end());int maxn = a[n];std::vector<i64> dp(maxn + 1);dp[0] = 1;std::vector<i64> f(n + 1);int ans = 0;for(int i = 1; i <= n; i++) {i64 sums = 0;for(int s = 0; s <= a[i]; s++) sums = (sums + dp[s]) % P;f[i] = (sums - 1 - (i - 1) + P) % P;for(int s = maxn; s >= a[i]; s--) dp[s] = (dp[s] + dp[s - a[i]]) % P;}i64 sum = 0;    //不合法子集数量之和for(int i = 1; i <= n; i++) {sum = (sum + f[i]) % P;}i64 T = (p2[n] - 1 - n - n * (n - 1) / 2 + P) % P;    //大小大于等于三的集合总数std::cout << (T - sum + P) % P;
}

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

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

相关文章

CSP-S2025

流程是: T1-60pts -> T2-56pts -> T3-10pts -> T4-8pts -> T1-100pts

MySQL 慢查询日志slow query log - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月离心喷雾干燥机,振动流化床干燥机,带式干燥机厂家最新推荐,品牌深度解析采购无忧之选!

近期,行业权威协会针对离心喷雾干燥机、振动流化床干燥机、带式干燥机领域开展专项测评,通过对设备性能参数、生产企业技术实力、市场用户反馈等多维度数据采集分析,最终形成本次推荐榜单。测评过程中,不仅对设备的…

unity技巧备忘

在编辑器,检视面板 中执行代码 using UnityEngine; public class HighScore : MonoBehaviour { public bool resetHighScoreNow = false;private void OnDrawGizmos(){if (resetHighScoreNow){resetHighScoreNow …

前端开发技术栈

目录Nodejs参考资料 Nodejs 工具链: Node.js 是前端开发工具链的重要组成部分,例如用于构建工具、包管理器(如 npm)等,这些工具可以在本地开发环境中运行。 非直接开发: 虽然 Node.js 本身不直接属于前端,但它通…

SOA、ESB、微服务、分布式概念及专业名词阐述

SOA、ESB、微服务概念1 SOA 面向服务 SOA全称:Service Oriented Architecture,面向服务框架。它是一种设计理念,其中包含多个服务,服务之间通过相互依赖最终提供一系列完成的功能。各个服务通常以独立的形式部署运…

unity技巧

在编辑器,检视面板 中执行代码 using UnityEngine; public class HighScore : MonoBehaviour { public bool resetHighScoreNow = false;private void OnDrawGizmos(){if (resetHighScoreNow){resetHighScoreNow …

项目2:图书管理系统(数据库入门)

核心功能:添加图书(书名、作者、ISBN、出版年份) 搜索图书(按书名、作者) 更新图书信息 删除图书 获取图书统计(总数、按作者分组)技术栈:SQLModel数据库集成 基础查询和过滤 简单数据统计 错误处理挑战点:数…

CF2153B Bitwise Reversion | 数学 | 模拟

CF2153B Bitwise Reversion | 数学 | 模拟 题目描述 给定三个非负整数 \(x\),\(y\) 和 \(z\),判断是否存在三个非负整数 \(a\)、\(b\)、\(c\),满足以下三个条件:\(a \mathbin{\&} b = x\) \(b \mathbin{\&…

DRL-QLearning与DQN

强化学习领域中,Q-learning和深度Q网络(DQN)是两个具有里程碑意义的算法。Q-learning奠定了传统强化学习的基础,而DQN则开启了深度强化学习的新时代。本文将深入探讨这两种算法的核心概念和工作原理,帮助读者理解它…

2025 年 11 月真空耙式干燥机,高效沸腾干燥机,盘式干燥机厂家最新推荐,高性能,稳定性强的行业优选

近期,行业设备性能评估协会联合稳定性测试机构,针对真空耙式干燥机、高效沸腾干燥机、盘式干燥机领域,开展 “高性能 - 强稳定” 专项测评。高性能维度设定三项核心标准:干燥效率(比行业平均水平高 15% 以上)、能…

2025 年 11 月盘式干燥机,空心桨叶干燥机,振动流化床干燥机厂家最新推荐,技术实力与市场口碑深度解析

近期,行业技术评估协会联合市场调研机构,针对盘式干燥机、空心桨叶干燥机、振动流化床干燥机领域,开展 “技术实力 - 市场口碑” 双维度专项解析。技术实力测评涵盖三项核心指标:一是研发硬实力(研发团队规模≥15…

2025 年 11 月双锥回转真空干燥机,离心喷雾干燥机,带式干燥机厂家最新推荐,专业制造与品牌保障口碑之选

近期,行业制造标准协会联合品牌评估机构,针对双锥回转真空干燥机、离心喷雾干燥机、带式干燥机领域,开展 “专业制造 - 品牌保障” 双核心测评。专业制造维度从三方面评估:一是生产工艺专业性(是否采用行业专用生…

DRL-时序差分学习

时序差分(Temporal Difference, TD)学习是强化学习中的一种核心方法,它结合了动态规划和蒙特卡洛方法的优点,实现了无需环境模型的在线学习。本指南将详细介绍TD学习的原理。时序差分学习技术指南 时序差分(Tempo…

再见了ThreadLocal,我决定用ScopedValue!

前言 今天我们来聊聊一个即将改变我们编程习惯的新特性——ScopedValue。 有些小伙伴在工作中,一提到线程内数据传递就想到ThreadLocal,但真正用起来却遇到各种坑:内存泄漏、数据污染、性能问题等等。 其实,Scoped…

查询增强插件pgfincore - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月双锥回转真空干燥机,真空耙式干燥机,盘式干燥机厂家最新推荐,聚焦资质、案例、售后的六家机构深度解读

近期,十家行业权威机构联合开展双锥回转真空干燥机、真空耙式干燥机、盘式干燥机专项测评,通过资质审核、案例验证、售后调研三大核心维度,对近百家厂家进行综合评估。资质审核环节重点核查企业专利数量、体系认证(…

2025 年 11 月高效沸腾干燥机,旋转闪蒸干燥机,空心桨叶干燥机厂家最新推荐,产能、专利、环保三维数据透视

近期,行业协会联合专业测评机构,针对高效沸腾干燥机、旋转闪蒸干燥机、空心桨叶干燥机领域开展专项评估,从产能、专利、环保三大核心维度构建测评体系。产能维度重点核查企业年产能规模、生产线自动化程度及订单交付…

如何把未分配的硬盘空间分配到另一个磁盘?Windows 11,如何将未分配的磁盘分配给 C 盘?怎么把未分配的磁盘合并到d盘

如何把未分配的硬盘空间分配到另一个磁盘?Windows 11,如何将未分配的磁盘分配给 C 盘?怎么把未分配的磁盘合并到d盘 基本上几步就能学会,先来看看,大概的思路就是:如果多余的盘存在,则需要删除这个磁盘券;扩展需…