第4次 CCF PTA编程培训师资认证考试 C++ 真题解析

本文解析了CCF PTA编程培训师资认证考试中涉及的C++真题,重点介绍了如何使用结构体定义数据,自定义排序规则以及处理输入输出。通过结构体存储整数及索引,实现奇数优先、数值与输入顺序相结合的排序。同时,文章还探讨了在处理学生成绩排序和确定面试分数线问题中结构体的应用,以及贪心算法在装载金币问题中的应用,强调了在有限资源下最大化价值的重要性。
第一题
试题编号:
试题名称:整数排序
时间限制: 1.0s
内存限制: 128.0MB
【问题描述】
老师给定 10 个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后;
2.奇数按从大到小排序;
3.偶数按输入顺序逆序排序。
【输入描述】
以下是对提供的CCF编程培训师资认证(PTA)真题的C语言解析: ### 真题1CCF PTA编程培训师资认证 - C - C++真题解析(2024上) - 彩虹密码 #### 目描述 彩虹密码是由一个字符串组成,是由原文字符串(由不超过 60 个小写字母组成)中每个字母向后移动 n 位形成的。z 的下一个字母是 a,如此循环。已知移动前的原文字符串及 n,需要求出彩虹密码。 #### 输入格式 第一行:n。第二行:未移动前的一串字母。 #### 输出格式 一行,彩虹密码。 #### 输入输出样例 输入 #1 ``` 1 qwe ``` 输出 #1 ``` rxf ``` #### 说明/提示 字符串长度 ≤60,n 在 int 范围内。 #### 代码实现 ```c #include <stdio.h> #include <string.h> int main() { int n; char str[61]; // 读取移动位数 n scanf("%d", &n); // 消耗掉 scanf 留下的换行符 getchar(); // 读取原文字符串 fgets(str, sizeof(str), stdin); // 去除 fgets 可能读取的换行符 str[strcspn(str, "\n")] = 0; for (int i = 0; str[i] != '\0'; i++) { // 计算移动后的字符 str[i] = ((str[i] - 'a' + n) % 26) + 'a'; } // 输出彩虹密码 printf("%s\n", str); return 0; } ``` #### 代码解释 1. **输入读取**:首先读取移动位数 `n`,然后使用 `fgets` 读取原文字符串。 2. **字符移动**:遍历原文字符串,对于每个字符,将其 ASCII 码减去 `'a'` 得到相对位置,加上 `n` 后对 26 取模,再加上 `'a'` 得到移动后的字符。 3. **输出结果**:输出移动后的字符串。 ### 真题2:CCF PTA编程培训师资认证真题 -编号:20210701 - 1 #### 目描述 该未明确给出目描述,但从代码可以推测是读取多个字符串并拼接,最后输出拼接后的字符串和其长度。 #### 代码实现 ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 int main() { char str[MAX_LEN] = ""; char temp[MAX_LEN]; // 读取第一个字符串 scanf("%s", str); printf("%s", str); // 继续读取字符串并拼接 while (scanf("%s", temp) == 1) { strcat(str, temp); printf("%s", str); } // 输出拼接后字符串的长度 printf("%zu\n", strlen(str)); return 0; } ``` #### 代码解释 1. **输入读取**:首先读取第一个字符串,然后使用 `while` 循环继续读取字符串。 2. **字符串拼接**:使用 `strcat` 函数将读取的字符串拼接到 `str` 中。 3. **输出结果**:输出拼接后的字符串和其长度。 ### 真题3:参考程序 #### 代码实现 ```c #include <stdio.h> #include <stdlib.h> #include <queue> #include <iostream> using namespace std; const int N = 2e5 + 5; const int E = N << 1; const long long oo = 1e18; int n, m, s, q; int h[N], to[E], nx[E], wt[E], et; int vis[N]; long long d[N]; priority_queue <pair<long long, int>> pq; void ae(int u, int v, int w) { et++; to[et] = v; nx[et] = h[u]; wt[et] = w; h[u] = et; } int main() { scanf("%d%d%d%d", &n, &m, &s, &q); for (int i = 1; i <= m; i++) { int u, v, l; scanf("%d%d%d", &u, &v, &l); ae(u, v, l); ae(v, u, l); } for (int i = 1; i <= n; i++) d[i] = oo; d[s] = 0; pq.push({0, s}); while (!pq.empty()) { auto p = pq.top(); pq.pop(); int u = p.second; if (vis[u]) continue; vis[u] = 1; for (int i = h[u]; i; i = nx[i]) if (d[u] + wt[i] < d[to[i]]) { d[to[i]] = d[u] + wt[i]; pq.push({-d[to[i]], to[i]}); } } while (q--) { int p; scanf("%d", &p); printf("%lld\n", d[p]); } return 0; } ``` #### 代码解释 该代码实现了 Dijkstra 算法,用于求解单源最短路径问1. **输入读取**:读取节点数 `n`、边数 `m`、源点 `s` 和查询数 `q`。 2. **图的构建**:使用邻接表存储图,通过 `ae` 函数添加边。 3. **初始化**:将所有节点的距离初始化为无穷大,源点的距离初始化为 0。 4. **Dijkstra 算法**:使用优先队列优化,不断更新节点的最短距离。 5. **查询结果**:根据查询的节点,输出其最短距离。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信奥源老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值