CF2034 A-E题解

news/2025/2/12 4:32:26/文章来源:https://www.cnblogs.com/th19/p/18580164

A. King Keykhosrow's Mystery

题意可以转化为存在 \(k_1,k_2\) 使得 \(m=a\times k_1+n = b\times k_2 +n\)。消去余数 \(n\) 得到 \(a\times k_1=b\times k_2\),即 \(a,b\) 的公倍数。所以最小的 \(m\) 就是 \(a,b\) 的最小公倍数,余数为 0。最小公倍数的计算方法是 \(\text{lcm}(a,b)=\dfrac{a\times b}{\gcd(a,b)}\)

B. Rakhsh's Revival

考虑贪心的处理:逐位扫过去,维护一个变量 \(cnt\) 记录当前连续 \(0\) 的个数,遇到 \(1\) 就清空。因为提前操作并不能减少操作次数,所以我们仅当 \(cnt=m\) 时进行操作,把从这一位开始连续 \(k\) 个赋值成 \(1\)(实现时不用真的赋值,直接下标加 \(k\) 即可)。

int cnt = 0, ans = 0;
for (int i = 0; i < n; i++)if (s[i] == '1') { cnt = 0; continue; }else if (++cnt == m) i += k - 1, ans++, cnt = 0; // 因为for还要i++,这里只加k-1; 记得操作后cnt也要清零
cout << ans << '\n';

C. Trapped in the Witch's Labyrinth

对于 \(n\times m\) 个格子,可以分 4 种情况考虑:

  • 连通的一片 ?:把连通的一片 ? 拆分成一个个矩形。除了 \(1\times 1\) 的矩形,都可以每行构造成 >>>>>< ,一定走不出去;\(1\times 1\) 的矩形直接指向别的 ? 即可。
  • 孤立的一个 ?:它的周围没有别的 ? 了,当且仅当存在确定方向的格子指向它时,它走不出去(反向指对方即可)。注意多个格子指向它时也不成问题,只需要反指任意一个,别的格子都会被导向这个 >< 的循环里。
  • 方向确定,一定能走出去:根据固定的方向最终走到了边界,或者已经确定的“能走出去的格子”。它们对答案没有贡献,dfs 时顺带标记掉就好。
  • 方向确定,走不出去:最终指向了 ?,走不出去。

所以从每个格子出发 dfs,如果是 ? 则把连通块的大小计入答案(大小为 1 即孤立时先不计入,插入 set 中以备查询);如果确定了方向则判断是否会走出,把走不出的连通块大小加入答案。最后对于所有的孤立点检查上下左右有没有走不出去的,有的话答案加 \(1\)

void solve(int test_case) {int n, m, siz, ans = 0;cin >> n >> m;vs s(n);vector<vc> vis(n, vc(m)); // 记录格子是否到达过vector<vc> out(n, vc(m)); // 记录格子是否会走出rep(i, 0, n - 1) cin >> s[i];set<pii> single; // 记录孤立点const int dx[4] = {-1, 1, 0, 0};const int dy[4] = {0, 0, -1, 1};map<char, int> mv = {{'U', 0}, {'D', 1}, {'L', 2}, {'R', 3}};auto inside = [&](int x, int y) -> bool {return x >= 0 && x < n && y >= 0 && y < m;};auto dfs1 = [&](auto&& dfs1, int x, int y) -> void { // 搜?的连通块vis[x][y] = 1;siz += 1;rep(i, 0, 3) {int tx = x + dx[i];int ty = y + dy[i];if (inside(tx, ty) && s[tx][ty] == '?' && !vis[tx][ty]) {dfs1(dfs1, tx, ty);}}};auto dfs2 = [&](auto&& dfs2, int x, int y) -> bool { // 搜方向确定的连通块vis[x][y] = 1;siz += 1;int d = mv[s[x][y]];int tx = x + dx[d];int ty = y + dy[d];if (!inside(tx, ty) || out[tx][ty]) {return out[x][y] = 1;}if (vis[tx][ty] || s[tx][ty] == '?') return 0;return out[x][y] = dfs2(dfs2, tx, ty);};rep(i, 0, n - 1) rep(j, 0, m - 1) {if (vis[i][j]) continue;siz = 0;if (s[i][j] == '?') {dfs1(dfs1, i, j);siz == 1 ? single.emplace(i, j), 0 : ans += siz;} else {ans += dfs2(dfs2, i, j) ? 0 : siz;}}for (auto [x, y] : single) {rep(i, 0, 3) {int tx = x + dx[i];int ty = y + dy[i];if (inside(tx, ty) && !out[tx][ty]) {ans += 1;break;}}}cout << ans << '\n';
}

D. Darius' Wisdom

用两个 set 记录 \(1,2\) 出现位置的下标,然后从后往前遍历,集合维护当前遍历位置前面的数(如果当前走到了 \(1,2\) 就从集合中删掉)。对于 \(0\) 来说,如果前面还有 \(2\),就从集合中找到一个 \(1\) 进行交换,再找到一个 \(2\) 进行交换;前面没有 \(2\) 了,就找到 \(1\) 进行交换;\(1\) 都没有则退出。对于 \(1\) 来说,如果前面有 \(2\) 就进行交换,否则跳过。次数显然小于 \(n\) 次。

void solve(int test_case) {int n;cin >> n;vi a(n);vector<pii> ans;set<int> s1, s2;rep(i, 0, n - 1) {cin >> a[i];if (a[i] == 1) {s1.insert(i);} else if (a[i] == 2) {s2.insert(i);}}dep(i, n - 1, 0) {if (a[i] == 2) {s2.erase(i); // 当前的2遍历过了,删掉continue;}if (a[i] == 1) {if (s2.empty()) {s1.erase(i); // 当前的1遍历过了,删掉continue;}int k = *s2.begin();s2.erase(k);swap(a[i], a[k]); // 交换1,2s1.erase(i);s1.insert(k); // 更新1的位置ans.emplace_back(i, k);continue;} // 下面 a[i] == 0if (s2.empty()) {if (s1.empty()) break; // 都没有,交换结束int k = *s1.begin();s1.erase(k); // 没有2了,1的位置就确定了,直接删掉swap(a[i], a[k]);ans.emplace_back(k, i);} else {int k1 = *s1.begin();int k2 = *s2.begin();s2.erase(k2); // 2的位置确定了,可以删掉s1.erase(k1);a[i] = 2, a[k1] = 0, a[k2] = 1;s1.insert(k2); // 更新1的位置ans.emplace_back(i, k1);ans.emplace_back(i, k2);}}cout << ans.size() << '\n';for (auto [i, j] : ans) {write("%d %d\n", i + 1, j + 1);}
}

E. Permutations Harmony

首先要判定一下 \(k\le n!\),这个只在 \(n\) 很小的情况下有可能超过,问题不大。然后注意到 \(k\) 为偶数时一定可以做,只需要找到 \(\dfrac{k}{2}\) 个对称的排列即可,如 1234|4321, 2134|3421 等。\(k\) 为奇数时,需要进一步讨论:

  • \(k=1\),只在 \(n=1\) 的情况下有解;\(k=n!-1\) 一定无解。
  • \(n\) 为偶数时一定无解,因为每个 \(i\) 的和相同,总和为 \(\dfrac{n(n+1)k}{2}\),每个 \(i\) 的和为 \(\dfrac{(n+1)k}{2}\)\(n\) 为偶数 \((n+1)k\) 除不开。
  • \(n\) 为奇数时,\(k\) 可以拆成 \(3\)\(k-3\),后者为偶数,前者有贪心构造方案如图。

image

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

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

相关文章

2024-2025-1(20241321)《计算机基础与程序设计》第十周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十周作业)这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>作业正文 ... 本博客链接https://www.cn…

MonoCD:具有互补深度的单眼3D物体检测

MonoCD:具有互补深度的单眼3D物体检测单眼3D对象检测因其能够以低成本,从单个图像中准确获得对象3D定位,而引起了广泛关注。由于2D到3D映射的不适定性,深度估计是单目3D对象检测的一个重要,但具有挑战性的子任务。许多方法探索多个局部深度线索,如物体高度和关键点,然后…

【牛客训练记录】华为杯2024年广东工业大学新生赛(同步赛)

训练情况赛后反思 组合数学还得加练,J题奇妙的乘法逆元预处理,开个unordered_map记忆化就过了?!,E题太头铁了,异或不算就直接交,F题又是急到没取模就直接交。 A题 字符串 Tomori 后面补上 Haruhikage。 #include <bits/stdc++.h> // #define int long long #defin…

攻防世界-baigeiRSA

一、题目 给了如下两个文件二、解题 1、查看代码发现就是简单的RSA加密算法,仔细分析一下发现flag就是明文,而要获得flag就要解密密文,但是代码中只提供了e。于是又去out文件翻了一下,常使用记事本打开,发现n和c已经给出,由于n的位数只有78个字符,可以尝试暴力分解因数2…

【TIA Portal V19软件下载与安装教程】

1、安装包 「TIA Portal V19(64bit).rar」 链接:https://pan.quark.cn/s/388931745834 提取码:VqMr 2、安装教程(建议关闭杀毒软件和系统防护) 1) 下载并解压安装包,右击执行NoRestart.bat文件2) 弹窗后,按任意键退出3) 安装Portal V19,管理员方式运…

《智能汽车传感器:原理设计应用》新书推荐

《智能汽车传感器:原理设计应用》新书推荐 由化学工业出版社资深编辑张海丽老师负责策划编辑。本书在京东、淘宝天猫、当当网上均有销售京东:https://search.jd.com/Search?keyword=%E6%99%BA%E8%83%BD%E6%B1%BD%E8%BD%A6%E4%BC%A0%E6%84%9F%E5%99%A8%EF%BC%9A%E5%8E%9F%E7%…

38. html_02

1. 标签的id属性和class属性 id 用于精确查找某个标签。 类似于标签的唯一标识符,用于在同一个页面上唯一标识一个特定的元素。每个id值在整个文档中都必须是唯一的,不能重复使用。通过id值,可以在JavaScript或CSS中引用特定标签,并对其进行操作或样式化。 class 类似于面向…

高级语言程序设计课程第九次个人作业(102400106刘鑫语)

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:102300106 姓名:刘鑫语 14.17.3;14.17.4 结构模板和数组,没有什么问题 14.17.5一开始定义days函数中试图访问month…

分布式训练

模型并行与数据并行 Parameter Server 同步更新: 在 work 比较多的情况下,parameter server 承受的压力会比较大,网络开销也大 异步更新: 1参数和更新用的梯度并不来自同一个迭代。用来更新的梯度可能是几步更新前的参数算出来的。 2参数的读取并没有加锁。这导致 worker 可…

宝塔安装thinkphp低版本路径不对

如果你在宝塔面板上安装了ThinkPHP低版本(例如ThinkPHP 5.0或更早版本),但遇到了路径问题,可以按照以下步骤进行排查和解决: 1. 检查网站根目录设置 确保你的网站根目录设置正确。通常,ThinkPHP项目的入口文件是 public 目录下的 index.php 文件。登录宝塔面板。 进入“网…

C#基础之集合讲解

目录1 集合1.1 数组1.1.1 简介1.1.2 声明使用1.1.2.1 声明 & 初始化1.1.2.2 赋值给数组1.1.2.3 访问数组元素1.1.3 多维数组1.1.3.1 声明1.1.3.2 初始化二维数组1.1.3.3 访问二维数组元素1.1.4 交错数组1.1.5 传递数组给函数1.1.6 Array1.1.6.1 简介1.1.6.2 属性1.1.6.3 方…