目录
- [T1. 统计指定范围里的数](#T1. 统计指定范围里的数)
- [T2. 按照个位数排序](#T2. 按照个位数排序)
- [T3. 过滤多余的空格](#T3. 过滤多余的空格)
- [T4. 图像叠加](#T4. 图像叠加)
- [T5. 出书最多](#T5. 出书最多)
T1. 统计指定范围里的数
给定一个数的序列 S S S,以及一个区间 [ L , R ] [L, R] [L,R],求序列中介于该区间的数的个数,即序列中大于等于 L L L 且小于等于 R R R 的数的个数。
时间限制:1 s
内存限制:64 MB
-
输入
第一行 1 1 1 个整数 n n n,表示序列的长度。 0 < n ≤ 10000 0 < n ≤ 10000 0<n≤10000。
第二行 n n n 个正整数,表示序列里的每一个数,每个数小于等于 10000000 10000000 10000000。
第三行 2 2 2 个整数 L L L、 R R R,分别表示区间的左端点,区间的右端点。 1 ≤ L ≤ R ≤ 1000000 1 ≤ L ≤ R ≤ 1000000 1≤L≤R≤1000000。 -
输出
输出一个整数,表示序列中大于等于 L L L 且小于等于 R R R 的数的个数。 -
样例输入
a5 11 8 1 10 16 1 10
-
样例输出
a3
思路分析
此题考查一维数组的查找与统计,属于入门题。
将给定数据存储在数组中之后,依次遍历每一个元素,检测其是否在指定范围 L L L 到 R R R 之内,若是,则计数器变量累加 1 1 1,最后输出计数器变量的值即可。
cpp
/*
* Name: T1.cpp
* Problem: 统计指定范围里的数
* Author: Teacher Gao.
* Date&Time: 2024/10/02 11:39
*/
#include <iostream>
using namespace std;
int main()
{
int n, L, R, a[10005] = {0};
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cin >> L >> R;
int tot = 0;
for (int i = 1; i <= n; i++) {
if (L <= a[i] && a[i] <= R) {
tot++;
}
}
cout << tot << endl;
return 0;
}
T2. 按照个位数排序
对于给定的正整数序列,按照个位数从小到大排序,个位数相同的按照本身大小从小到大排序。
时间限制:1 s
内存限制:64 MB
-
输入
第一行 1 1 1 个整数 n n n,表示序列的大小。 0 < n ≤ 1000 0 < n ≤ 1000 0<n≤1000。
第二行 n n n 个正整数,表示序列的每个数,每个数不大于 100000000 100000000 100000000。 -
输出
输出按照题目要求排序后的序列。 -
样例输入
a6 17 23 9 13 88 10
-
样例输出
a10 13 23 17 88 9
思路分析
此题考查排序算法,难度一般。
此题比较麻烦的点在于排序规则,但是只要仔细去分析,是不太可能会出错的。由于数据量较小,任何时间复杂度不高于 O ( n 2 ) O(n^2) O(n2) 的排序算法均可以解决此题。更方便地是采用 sort
函数,此时需要自定义比较规则,只需要按照题目要求完成自定义规则的书写即可,具体参考示例代码。
cpp
/*
* Name: T2.cpp
* Problem: 按照个位数排序
* Author: Teacher Gao.
* Date&Time: 2024/10/02 11:45
*/
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) {
if (a % 10 != b % 10) {
return a % 10 < b % 10;
}
return a < b;
}
int main()
{
int n, a[1005] = {0};
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
return 0;
}
T3. 过滤多余的空格
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
时间限制:1 s
内存限制:64 MB
-
输入
一行,一个字符串(长度不超过 200 200 200),句子的头和尾都没有空格。 -
输出
过滤之后的句子。 -
样例输入
aHello world.This is c language.
-
样例输出
aHello world.This is c language.
思路分析
此题考查字符串操作,难度入门。
此题本意是考查字符串的查找与删除操作,然而利用 cin
无法读取空格这个事实,我们可以非常优雅的解决此题。
cpp
/*
* Name: T3.cpp
* Problem: 过滤多余的空格
* Author: Teacher Gao.
* Date&Time: 2024/10/02 11:56
*/
#include <iostream>
using namespace std;
int main()
{
bool flag = 1;
string s;
while (cin >> s) {
if (flag) flag = 0;
else cout << " ";
cout << s;
}
return 0;
}
T4. 图像叠加
给出两幅相同大小的黑白图像(用 0 − 1 0-1 0−1 矩阵)表示, 0 0 0 表示白点, 1 1 1 表示黑点,求两幅图像叠加后的图像。
说明:若两幅图像在相同位置上的像素点都是白色,叠加后为白色,否则为黑色。
时间限制:1 s
内存限制:64 MB
-
输入
第一行包含两个整数 m m m 和 n n n,表示图像的行数和列数,中间用单个空格隔开。 1 ≤ m ≤ 100 , 1 ≤ n ≤ 100 1 \le m \le 100, 1 \le n \le 100 1≤m≤100,1≤n≤100。
之后 m m m 行,每行 n n n 个整数 0 0 0 或 1 1 1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
之后 m m m 行,每行 n n n 个整数 0 0 0 或 1 1 1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。 -
输出
m m m 行,每行 n n n 个整数,表示叠加后黑白图像上各像素点的颜色。 -
样例输入
a3 3 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1
-
样例输出
a1 1 1 0 0 1 1 1 1
思路分析
此题考查二维数组的基本操作,难度入门。
此题的图像叠加过程可以用 if
语句进行判断实现,在输入第二个数组的过程中就可以进行数据处理了,因此可以不用第二个数组。考虑到图像数据只有 0 0 0 和 1 1 1,可以用按位或 |
免去 if
语句,实现更简洁的代码,具体参考示例代码。事实上,在处理过程中就可以进行输出了,这里为了保持输出结果易查,单独写了输出的循环。
cpp
/*
* Name: T4.cpp
* Problem: 图像叠加
* Author: Teacher Gao.
* Date&Time: 2024/10/02 11:59
*/
#include <iostream>
using namespace std;
int main()
{
int m, n, b, a[105][105];
cin >> m >> n;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> b;
a[i][j] |= b;
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
T5. 出书最多
假定图书馆新进了 m m m( 10 ≤ m ≤ 999 10 ≤ m ≤ 999 10≤m≤999)本图书,它们都是由 n n n( 1 ≤ n ≤ 26 1 ≤ n ≤ 26 1≤n≤26)个作者独立或相互合作编著的。假设 m m m 本图书编号为整数( 1 1 1 到 999 999 999),作者的姓名为字母( A A A 到 Z Z Z),请根据图书作者列表找出参与编著图书最多的作者和他的图书列表。
时间限制:1 s
内存限制:64 MB
-
输入
第一行为所进图书数量 m m m,其余 m m m 行,每行是一本图书的信息,其中第一个整数为图书编号,接着一个空格之后是一个由大写英文字母组成的没有重复字符的字符串,每个字母代表一个作者。输入数据保证仅有一个作者出书最多。 -
输出
输出有多行:
第一行为出书最多的作者字母;
第二行为作者出书的数量;
其余各行为作者参与编著的图书编号(按输入顺序输出)。 -
样例输入
a11 307 F 895 H 410 GPKCV 567 SPIM 822 YSHDLPM 834 BXPRD 872 LJU 791 BPJWIA 580 AGMVY 619 NAFL 233 PDJWXK
-
样例输出
aP 6 410 567 822 834 791 233
思路分析
此题考查二维数组和桶的思想,难度一般。
桶的思想用来解决前两问,具体可以参考 2021 年 9 月二级 T5,二维数组用来解决第三问,即存储每个作者的图书列表。事实上,我们可以用 vector
这个模板来更好的实现存储每个作者的图书列表这个功能。具体参考示例代码。
cpp
/*
* Name: T5.cpp
* Problem: 出书最多
* Author: Teacher Gao.
* Date&Time: 2024/10/02 13:56
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, x;
vector<int> book[100];
cin >> n;
string auth;
for (int i = 1; i <= n; i++) {
cin >> x >> auth;
for (int j = 0; j < auth.size(); j++) {
book[auth[j]].push_back(x);
}
}
int ans = 0;
char id = 0;
for (int i = 'A'; i <= 'Z'; i++) {
if (book[i].size() > ans) {
ans = book[i].size();
id = i;
}
}
cout.put(id);
cout << endl << ans << endl;
for (int i = 0; i < ans; i++) {
cout << book[id][i] << endl;
}
return 0;
}