学而思编程周赛语言基础组 | 2025年秋第12周
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总贴:学而思编程周赛语言基础组 | 汇总
T1 神奇序列
【题目来源】
【题目描述】
小A认为,如果把一个字符序列 \(s\) 重复写下去,得到的无穷的序列就是一个神奇的字母序列。
例如:当 s = "LCR" 时,"LCRLCRLCRL..." 就是生成的神奇序列。
现在初始的字符序列 \(s\) 给定,小A想知道由 \(s\) 生成的神奇序列的第 \(n\) 个字母是哪个。
【输入】
第一行一个整数:\(n\)。
第二行一个字符串 \(s\)。
【输出】
单个字符:表示生成的神奇序列的第 \(n\) 个字母。
【输入样例】
5
LCR
【输出样例】
C
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
int main()
{
cin >> n >> s;
int len = s.size(); // 获取字符串长度
s = " " + s; // 在字符串前加空格,使下标从1开始
n = (n + len - 1) % len + 1; // 计算实际位置
cout << s[n] << endl; // 输出第n个字符
return 0;
}
【运行结果】
5
LCR
C
T2 竞赛排名
【题目来源】
【题目描述】
众所周知 CSP 复赛是全国统一命题的,但获奖的时候是按照各省分别排序的。
现在假设全国有 \(n\) 名同学参加了CSP-J的复赛,我们知道每个同学的编号(编号固定为一个 \(5\) 位数字,数字可以有前导 \(0\)),复赛的成绩,以及该同学来自哪个省份(用两个大写英文字母表示)。
现在需要你对全国的选手成绩进行按省份排名。
具体的你可以理解为,我们首先需要按照每位同学所在省份的字典序从小到大排,如果省份相同,按照成绩从大到小排序,如果成绩也相同,按照考生的编号从小到大排序。保证同一省份的同学编号一定不同。
这个也基本符合 CCF 官方公布获奖名单时的排序方法。
【输入】
第一行一个数字 \(n\),表示全国参加 CSP-J 复赛的人数。
接下来 \(n\) 行,每行包含三个用空格分隔的内容,分别是该同学所在省份的缩写,同学的编号,以及同学的成绩。
【输出】
输出 \(n\) 行,每行包含三个用空格分隔的内容,表示排完序后,同学所在省份的缩写,同学的编号,以及同学的成绩。
【输入样例】
4
AH 01427 395
BJ 00210 400
BJ 99999 0
BJ 00013 400
【输出样例】
AH 01427 395
BJ 00013 400
BJ 00210 400
BJ 99999 0
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n;
struct Stu
{
string sf, id;
int score;
}a[N];
bool cmp(Stu x, Stu y)
{
if (x.sf != y.sf) return x.sf < y.sf; // 先按省份排序
if (x.score != y.score) return x.score > y.score; // 同省按分数降序
return x.id < y.id; // 同分按学号升序
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i].sf >> a[i].id >> a[i].score;
}
sort(a + 1, a + n + 1, cmp); // 排序
for (int i = 1; i <= n; i++)
cout << a[i].sf << " " << a[i].id << " " << a[i].score << endl;
return 0;
}
【运行结果】
5
AH 00003 200
AH 00090 86
AH 00008 99
AH 11682 270
AH 60328 333
AH 60328 333
AH 11682 270
AH 00003 200
AH 00008 99
AH 00090 86
T3 重新排列字符串
【题目来源】
【题目描述】
给定两个字符串,把第一个字符串称为“A串”,第二个字符串称为“B串”,这些字符串都是由 2626 个小写字母和 'L'、'C'、'R'、'&'、'O'、'I' 这六个字符组成。
现在我们对“A串”进行重新排列,需要求出得到若干新的字符串中所能形成“B串”的最大数量。
注意: A串中每个字符都最多只能使用一次。
【输入】
第一行为一个字符串,表示"A串"。
第二行为一个字符串,表示"B串"。
【输出】
一个正整数表示所能形成“B串”的最大数量。
【输入样例】
adadaLLLCORR&&&&qwe
IO
【输出样例】
0
【代码详解】
#include <bits/stdc++.h>
using namespace std;
string a, b;
int B[1005], C[1005], ans = 1e9;
int main()
{
cin >> a >> b; // 输入两个字符串
// 统计字符串a中每个字符的出现次数
for (int i = 0; i < a.size(); i++)
B[a[i]]++;
// 统计字符串b中每个字符的出现次数
for (int i = 0; i < b.size(); i++)
C[b[i]]++;
// 计算a最多能包含多少个b
for (int i = 0; i < b.size(); i++)
ans = min(ans, B[b[i]] / C[b[i]]);
cout << ans << endl;
return 0;
}
【运行结果】
adadaLLLCORR&&&&qwe
IO
0

浙公网安备 33010602011771号