洛谷 [语言月赛 202410] 题解(C++)

news/2024/10/23 22:28:11/

本文为洛谷 [语言月赛 202410] 的全部题解(最后一题太麻烦暂时给不出完整代码)

目录

题一:

题目大意和解答思路:

代码(C++):

题二:

题目大意和解答思路:

代码(C++):

题三:

题目大意和解答思路:

代码(C++):

题四:

题目大意和解答思路:

代码(C++):

题五:

题目大意和解答思路:

代码(C++):

题六:

题目大意和解答思路:

代码(C++):        

题七:

题目大意和解答思路:

代码(C++):

题八:

题目大意和解答思路:


题一:

B4042 [语言月赛 202410] 顺序结构 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

根据题目对输入进来的变量a进行操作即可

代码(C++):

int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int a;std::cin >> a;std::cout << (a + 5) * 3 << " " << a * 3 + 5 << "\n";
}

题二:

题目大意和解答思路:

题目关键:

她想知道有哪些刻度和 a 厘米刻度的距离恰好是 b

比较a - b >= 0, 比较  a + b <= n

满足前者,就输出a - b
满足后者,就输出a + b
都不满足就输出No solution
注意b = 0 的时候,输出a

根据上面思路即可很快完成代码

我这里使用一个vector简化

代码(C++):

int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int n, a, b;std::cin >> n >> a >> b;if (b == 0) {std::cout << a << "\n";return 0;}std::vector<int> res;if (a - b >= 0) res.push_back(a - b);if (a + b <= n) res.push_back(a + b);if (res.empty()) {std::cout << "No solution\n";} else {for (int x : res) {std::cout << x << " ";}std::cout << "\n";}
}

题三:

B4045 [语言月赛 202410] 同桌 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

就是说,现在是第一周的周六

然后每个课程都会在第一次课都会在第一周开始,w为星期几开始,d为隔几周开一次课

求下一次最近上课的需要隔多少天
 

都是周一到周五,所以没有其他的条件

直接算出每个课程下次上课的间隔,然后求出最小值即可

代码(C++):

int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int n;std::cin >> n;int res = 14 * 7; //d 最大为14,所以可以初始化14 * 7for (int i = 0; i < n; i++) {int w, d;std::cin >> w >> d;int next = (w - 6) + d * 7;res = std::min(res, next);}std::cout << res << "\n";
}

题四:

B4045 [语言月赛 202410] 同桌 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

就是说,一共有n 个桌子,2 * n个人,然后每两个人坐一个桌子,这两个人是同桌

然后输入每个人希望的同桌,判断最后是否能满足每个人的希望,注意自己不能跟自己为同桌

很常规的模拟

首先用一个大小为2*n + 1的数组A来存数据(下标从1开始),然后呢

首先自己不能跟自己做同桌,那么A[i] != i这个条件必须满足

然后判断希望的同桌, 编号A[i] 是编号 第 i 位同学希望的同桌, 那么编号A[i] 希望的同桌呢?很明显是A[A[i]], 那么此时只用判断A[A[i]] == i 这个条件即可

代码(C++):

int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int n;std::cin >> n;std::vector<int> A(n * 2 + 1);for (int i = 1; i <= 2 * n; i++) {std::cin >> A[i];}for (int i = 1; i <= 2 * n; i++) {bool f = (A[i] != i && A[A[i]] == i);if (!f) {std::cout << "No\n";return 0;}}std::cout << "Yes\n";
}

题五:

B4046 [语言月赛 202410] 寻找质数 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

题目意思就是,从1 ~ n这n个数字中,满足“孤独数”性质的数字,第k大的是多少

可以这么模拟,先定义一个变量cnt, 从n 开始循环遍历到 1,碰到一个满足条件的“孤独数”就把cnt++,当cnt == k的时候,表示找到了第k大的数字,输出然后return 0 即可

遍历完还没找到的话,输出-1即可

代码(C++):

bool is_prime(int n) {if (n <= 1) return false;if (n <= 3) return true;if (n % 2 == 0 || n % 3 == 0) return false;for (int i = 5; i * i <= n; i += 6) {if (n % i == 0 || n % (i + 2) == 0) return false;}return true;
}
bool is_lone(int n, int m, int r) {return is_prime(n) && n % m == r;
}
int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int n, m, r, k;std::cin >> n >> m >> r >> k;int cnt = 0;for (int i = n; i >= 1; i--) {if (is_lone(i, m, r)) {cnt++;}if (cnt == k) {std::cout << i << "\n";return 0;}}std::cout << "-1\n";
}

题六:

B4047 [语言月赛 202410] 校门外的施工 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

这题主要是要读清楚题目的意思,一共有m棵树,每个树之间有一片绿化带

然后进行了n次施工,施工类型为两种,然后题目是求施工后还剩下多少棵树

这题就是源于题目的改编:P1047 [NOIP2005 普及组] 校门外的树 - 洛谷 | 计算机科学教育新生态

加了一个绿化带然后和施工方案

数据量不大,重复遍历即可

首先根据题目条件就是一个长度为2 * m的全部元素初始化为1数组(下标从1开始),然后每一棵树的位置x变成了x * 2 - 1

然后每次施工,根据条件,把这一区间都变成0,最后数出树的个数和绿化带个数即可

当然还有效率更高的方法,可以参考我的文章,区间合并:

算法题练习小技巧之区间合并--套路详细讲解带例题和源码(Python,C++)_区间合并c++-CSDN博客

代码(C++):        

int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int m, n;std::cin >> m >> n;std::vector<int> A(2 * m, 1);while (n--) {int op, l, r;std::cin >> op >> l >> r;if (op == 1) {for (int i = 2 * l; i < r * 2 - 1; i++) {A[i] = 0;}} else {for (int i = 2 * l - 1; i <= r * 2 - 1; i++) {A[i] = 0;}}}int cnt1 = 0, cnt2 = 0;for (int i = 1; i < 2 * m; i++) {if (A[i]) {if (i % 2 == 0) {cnt2++;} else {cnt1++;}}}std::cout << cnt1 << " " << cnt2 << "\n";
}

题七:

B4048 [语言月赛 202410] 断章取义 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

有点看不懂这个题目的T是啥意思

题目的意思就是说,给一个字符串,让你每一轮删除里面所有的"not"
让你输出最后的字符串和删除轮数

库函数秒了,先用一个while 1循环,然后 .find("not"),找出第一个not的位置,如果没找到就退出大循环,如果找到了,就从这个位置开始反复找和删,然后cnt++即可


代码(C++):

int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int t;std::cin >> t;std::string s;std::cin >> s;int cnt = 0;while (true) {int idx = s.find("not");if (idx == std::string::npos) {break;}while (idx != std::string::npos) {s.erase(idx, 3);idx = s.find("not", idx);}cnt++;}std::cout << s << "\n" << cnt << "\n";
}

题八:

B4049 [语言月赛 202410] 平均分计算 - 洛谷 | 计算机科学教育新生态

题目大意和解答思路:

感觉好麻烦, 而且学号还放在最后一位了,真恶心

不过可以用结构体进行模拟吧
 

struct Course {int people;std::vector<int> id;std::vector<int> part;std::vector<int> score;Course(int p) : people(p), id(p), part(p), score(p) {}
};

然后最后记得用gcd方法来格式化答案


http://www.ppmy.cn/news/1541454.html

相关文章

《整洁代码最佳实践》阅读心得

《整洁代码最佳实践》心得 阅读《整洁代码最佳实践》这篇文章后&#xff0c;我深感共鸣。作者通过自身经历分享了许多宝贵的观点&#xff0c;不仅强调了整洁代码的重要性&#xff0c;而且还提供了一些具体的实践建议。以下是我在阅读后的几点体会&#xff1a; 1. 命名的重要性…

插入排序(Python)

插入排序是一种简单直观的排序算法&#xff0c;其工作原理类似于我们平时整理扑克牌或书籍的方式。它的核心思想是将数组分为已排序和未排序两部分&#xff0c;每次从未排序部分取出一个元素&#xff0c;将其插入到已排序部分的适当位置&#xff0c;从而保持已排序部分的有序性…

MySQL的并行复制原理

1. 并行复制的概念 并行复制&#xff08;Parallel Replication&#xff09;是一种通过同时处理多个复制任务来加速数据复制的技术。它与并发复制的区别在于&#xff0c;并行复制更多关注的是数据块或事务之间的并行执行&#xff0c;而不是单纯的任务并发。在数据库主从复制中&…

Element Plus的el-tree-v2 组件实现仅叶子节点显示勾选框,并且只能单选

实现代码 <template><el-tree-v2:data"treeData":props"defaultProps"node-key"id"ref"treeRef"show-checkbox:check-strictly"true":expand-on-click-node"false"node-click"handleNodeClick&quo…

Docker容器间链路管理

Docker容器是一个轻量级的、可移植的软件打包技术&#xff0c;它允许开发者将应用程序及其依赖项打包到一个独立的容器中&#xff0c;然后发布到任何支持Docker的环境中运行。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff0c;容器性能开销极低。 可以将…

赋值 浅拷贝 深拷贝

赋值操作 赋值操作&#xff08;如 b a&#xff09;只是将变量 b 指向变量 a 当前指向的对象。这意味着 b 和 a 引用同一个对象。如果对象是可变的&#xff08;如列表、字典&#xff09;&#xff0c;对对象的修改会反映在所有引用该对象的变量上。 a [1, 2, 3] b a a[0] 9…

计算机毕业设计 | vue+springboot 在线花店后台管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着社会发展&#xff0c;网上购物已经成为我们日常生活的一部分。但是&#xff0c;至今为止大部分电商平台都是从人们日常生活出发&#xff0c;出售都是一些日常用品比如&#xff1a;食物、服装等等&#xff0c;并未发现一个专注于鲜花的电商…

Python GUI 编程:tkinter 初学者入门指南——复选框

在本文中&#xff0c;将介绍 tkinter Checkbox 复选框小部件以及如何有效地使用它。 复选框是一个允许选中和取消选中的小部件。复选框可以保存一个值&#xff0c;通常&#xff0c;当希望让用户在两个值之间进行选择时&#xff0c;可以使用复选框。 要创建复选框&#xff0c;…