上海计算机学会4月月赛 丙组题解

2024-04-25 03:28

本文主要是介绍上海计算机学会4月月赛 丙组题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上海计算机学会 4 月月赛 丙组题解
本次比赛涉及知识点: g c d gcd gcd、字符串、逆序数、思维、前缀和、结构体排序、 b f s bfs bfs

比赛链接:https://iai.sh.cn/contest/61

第一题:T1最大公约数

标签 g c d gcd gcd
题意:求 a a a b b b的最大公约数( 1 ≤ a , b ≤ 1 , 000 , 000 , 000 1≤a,b≤1,000,000,000 1a,b1,000,000,000
题解:辗转相除法 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
代码

#include <bits/stdc++.h>
using namespace std;int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);
}int main() {int a, b;cin >> a >> b;cout << gcd(a, b) << endl;// 手写gcd 或者 直接调用库函数__gcd// cout << __gcd(a, b) << endl;return 0;
}

第二题:T2子序列的判定

标签:字符串
题意:给定一个字符串 p p p和字符串 t t t,判断 p p p是否是 t t t的一个子序列。子序列就是字符串中保持原本顺序但不必连续的字符序列。( 1 ≤ ∣ p ∣ ≤ ∣ t ∣ ≤ 300 , 000 1≤∣p∣≤∣t∣≤300,000 1≤∣p∣≤∣t∣≤300,000
题解:从前往后遍历字符串 p p p的每个字符,同时遍历字符串 t t t,一直到找到对应字符或者到最后一个字符为止,找到后同时往后推一位,继续找;没找到,直接输出 N o No No跳出即可。
代码

#include <bits/stdc++.h>
using namespace std;int main() {string p, t;cin >> p >> t;int n = p.size(), m = t.size();for (int i = 0, j = 0; i < n; i++, j++) {while (j < m && t[j] != p[i]) j++;if (j == m) { // 到t字符串最后没找到对应的字符cout << "No";return 0;}}cout << "Yes";return 0;
}

第三题:T3交换的次数

标签:逆序数、思维、前缀和
题意:给定一个长度为 n n n 01 01 01序列, 1 1 1 0 0 0相邻就将 1 1 1调后面去,问最终调换的次数。
1 ≤ n ≤ 300 , 000 1≤n≤300,000 1n300,000
题解:很典型的一个逆序数,求每个数后面有多少的比自己小的数,因为 n n n比较大,两层循环去求逆序数肯定会超时,这边可以通过归并排序或者树状数组之类的数据结构去查询。但是这个序列中又只有 1 1 1 0 0 0,那我们可以通过后缀和统计一下 0 0 0的数量,到时候从前往后跑一下每个 1 1 1的位置,统计一下每个 1 1 1的位置后面有多少个 0 0 0的数。
或者反过来想看看每个 0 0 0之前有多少个 1 1 1,直接正着跑一边,对应计数即可。下面给出两种算法的代码
这边注意一个细节,最坏情况 数量可能爆 i n t int int,得开 l o n g l o n g long\ long long long
代码 1

#include <bits/stdc++.h>
using namespace std;string s;
int suf[300005]; // 后缀0的数量int main() {cin >> s;int n = s.size();long long ans = 0;for (int i = n - 1; i >= 0; i--) {suf[i] = suf[i + 1];if (s[i] == '0') suf[i]++;}for (int i = 0; i < n; i++) {if (s[i] == '1') ans += suf[i + 1];}cout << ans << endl;return 0;
}

代码 2

#include <bits/stdc++.h>
using namespace std;int main() {string s;cin >> s;int n = s.size();long long ans = 0, cnt = 0; // cnt: 前缀1的数量for (int i = 0; i < n; i++) {if (s[i] == '1') cnt++;else ans += cnt;}cout << ans << endl;return 0;
}

第四题:T4排序分数

标签 g c d gcd gcd、结构体排序
题意:给定正整数 n n n,请按从小到大的顺序输出所有大于 0 0 0且小于 1 1 1的,分母不超过 n n n的最简分数。( 2 ≤ n ≤ 500 2≤n≤500 2n500
题解:按照题目要求把所有的情况都列出来存到结构体数组里面,这边判一下是否互质,不互质就不存了,不然到时候会有重复(比如 1 / 2 , 2 / 4 1/2,2/4 1/22/4化成最简都是 1 / 2 1/2 1/2)。然后按照分数值从小到大排序一下,输出即可。
代码

#include <bits/stdc++.h>
using namespace std;int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);
}struct node {int a, b;double c;
}p[250005];bool cmp(node x, node y) {return x.c < y.c;
}int main() {int n, cnt = 0;cin >> n;for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {if (gcd(i, j) == 1) { // 互质p[++cnt].a = i;p[cnt].b = j;p[cnt].c = 1.0 * p[cnt].a / p[cnt].b;}}}sort(p + 1, p + 1 + cnt, cmp);for (int i = 1; i <= cnt; i++) {cout << p[i].a << "/" << p[i].b << endl;}return 0;
}

第五题:T5数字迷宫

标签 b f s bfs bfs
题意:给定一个 n n n x m m m的数字迷宫,每个位置有一个数字 a [ i ] [ j ] a[i][j] a[i][j],表示走到该格子之后,可以往上下左右任意方向移动 a [ i ] [ j ] a[i][j] a[i][j]的距离。求从 ( 1 , 1 ) (1,1) (1,1)移动到 ( n , m ) (n,m) (n,m)位置,最少需要走多少次。
题解:裸的 b f s bfs bfs,在基础模板上改下变化的新移动位置即可。
代码

#include <bits/stdc++.h>
using namespace std;int n, m, a[1005][1005];
int vis[1005][1005];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};struct node {int x, y, step;
};int main() {cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> a[i][j];queue<node> q;q.push({1, 1, 0});vis[1][1] = 1;while (!q.empty()) {node cur = q.front();if (cur.x == n && cur.y == m) {cout << cur.step << endl;return 0;}q.pop();for (int i = 0; i < 4; i++) {int nx = cur.x + a[cur.x][cur.y] * dx[i];int ny = cur.y + a[cur.x][cur.y] * dy[i];if (nx < 1 || nx > n || ny < 1 || ny > m) continue;if (vis[nx][ny]) continue;vis[nx][ny] = 1;q.push({nx, ny, cur.step + 1});}}cout << "No Solution" << endl;return 0;
}

这篇关于上海计算机学会4月月赛 丙组题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933588

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

为何我建议你学会抄代码?

文章目录 为何我建议你学会抄代码?一、引言二、抄代码的艺术1、理解抄代码的真正含义1.1、抄代码的好处 2、如何有效地抄代码2.1、发现问题2.2、整理需求2.3、造轮子标准流程 三、抄代码的实践案例1、发现问题2、整理需求3、设计重试机制4、实现重试工具类5、使用重试工具类6、优化和扩展 四、总结 为何我建议你学会抄代码? 一、引言 在编程的世界中,“抄代码” 常被视为一

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学