目录
- [T1. 一半](#T1. 一半)
- [T2. 打印锯齿](#T2. 打印锯齿)
- [T3. 充电宝](#T3. 充电宝)
- [T4. 漫画书](#T4. 漫画书)
- [T5. 实心正方形](#T5. 实心正方形)
T1. 一半
给定一个长度为 4 4 4 的大写字母字符串 S S S,请判断它是否满足以下两个条件:字符串中恰好包含两种不同字母;这两种字母都恰好出现两次。
时间限制:1 s
内存限制:256 MB
-
输入
一个字符串 S S S, S S S 一定是长度为 4 4 4 的大写字符串。 -
输出
如果满足条件,输出Yes,否则输出No。 -
样例输入 1
aMAMA -
样例输出 1
aYes -
样例输入 2
aDEED -
样例输出 2
aYes -
样例输入 3
aPEER -
样例输出 3
aNo
思路分析
此题考察字符串遍历,属于入门题。
可以用一个数组统计出每个字符出现的次数,然后进行检测:多于 2 2 2 个不同的字符则不满足条件;出现过的字符中,任一字符出现次数不是 2 2 2 次则不满足条件。
较为简单的方法是对字符串进行排序,如果要满足条件,那么应该前 2 2 2 个字符相同,后 2 2 2 个字符相同,中间 2 2 2 个字符不相同。
cpp
/*
* Name: T1.cpp
* Problem: 一半
* Author: Teacher Gao.
* Date&Time: 2026/01/21 16:03
*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
string s;
cin >> s;
sort(s.begin(), s.end());
if (s[0] == s[1] && s[1] != s[2] && s[2] == s[3]) {
cout << "Yes\n";
}
else {
cout << "No\n";
}
return 0;
}
T2. 打印锯齿
给定一个整数 n n n,请打印一个锯齿图形,这个锯齿应该分成 n n n 段,每段形如 /\。
时间限制:1 s
内存限制:256 MB
-
输入
单个整数:表示 n n n, 1 ≤ n ≤ 10 5 1\le n\le 10^5 1≤n≤105。 -
输出
输出该锯齿图形。 -
样例输入 1
a4 -
样例输出 1
a/\/\/\/\ -
样例输入 2
a9 -
样例输出 2
a/\/\/\/\/\/\/\/\/\
思路分析
此题考察循环结构,属于入门题。
按照题意进行输出即可,注意输出反斜杠 \ 时,需要使用转义字符 '\\'。
cpp
/*
* Name: T2.cpp
* Problem: 打印锯齿
* Author: Teacher Gao.
* Date&Time: 2026/01/21 16:16
*/
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cout << "/\\";
}
return 0;
}
T3. 充电宝
有一块电量为 n n n 的充电宝,她计划给若干块电池充电,每次充电时会有一定电量的损失,使用电量 a i a_i ai 时,其损失电量为 f ( a i ) f(a_i) f(ai), f ( x ) f(x) f(x) 表示除 x x x 以外 x x x 的最大因子。注意:若只充电 1 1 1 点,其损失电量也为 1 1 1。
应该如何分配用光电量,使得损失总量最小。
时间限制:1 s
内存限制:256 MB
-
输入
输入一个正数表示总电量 n n n, 2 ≤ n ≤ 2 × 10 9 2\le n\le 2\times10^9 2≤n≤2×109。 -
输出
输出最小损失电量。 -
样例输入 1
a4 -
样例输出 1
a2 -
样例输入 2
a9 -
样例输出 2
a2
思路分析
此题考察数论中的哥德巴赫猜想,属于思维题。虽然哥德巴赫猜想至今未被证明,但是在题目的限定范围 2 × 10 9 2\times 10^9 2×109 之内是没有反例的,因此本题可用。
由于每个素数只有两个因子,除去它本身之外,最大的因子就是 1 1 1,因此每次使用的电量为素数时,损失电量最少。要想总损失最小,就应将总电量 n n n 分解为最少数量的素数。
- 如果 n n n 是素数,损失为 1 1 1;
- 如果 n n n 是偶数(且不是素数),根据哥德巴赫猜想,偶数可以拆分为两个素数之和,损失为 2 2 2;
- 如果 n n n 是奇数(且不是素数),先尝试将 n n n 分解为 2 2 2 和 n − 2 n-2 n−2,
- 如果 n − 2 n-2 n−2 是素数,则损失为 2 2 2;
- 如果 n − 2 n-2 n−2 不是素数,则由于 n − 3 n-3 n−3 是偶数,根据哥德巴赫猜想,可以将 n − 3 n-3 n−3 分解为两个素数之和,于是损失为 3 3 3。
cpp
/*
* Name: T3.cpp
* Problem: 充电宝
* Author: Teacher Gao.
* Date&Time: 2026/01/26 19:33
*/
#include <iostream>
using namespace std;
bool isPrime(int x) {
if (x <= 1) return 0;
if (x == 2) return 1;
if (x % 2 == 0) return 0;
for (int i = 3; i * i <= x; i += 2) {
if (x % i == 0) return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
int n, ans;
cin >> n;
if (isPrime(n)) ans = 1;
else if (n % 2 == 0) ans = 2;
else {
if (isPrime(n - 2)) ans = 2;
else ans = 3;
}
cout << ans << endl;
return 0;
}
T4. 漫画书
一套漫画书共有 n n n 册,第 i i i 册包含 a i a_i ai 个章节。已知全书总章节数是奇数。如果把第 1 1 1 册第 1 1 1 章算作整册书的第 1 1 1 章,那么这套书正中间的那一章位于第几册第几章?
时间限制:1 s
内存限制:256 MB
-
输入
第一行:一个整数 n n n, 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100。
第二行: n n n 个整数 a 1 , a 2 , ... , a n a_1,a_2,...,a_n a1,a2,...,an,用空格隔开, 1 ≤ a i ≤ 100 1\le a_i\le 100 1≤ai≤100。保证书的章节总数为奇数。 -
输出
两个整数 a , b a, b a,b,表示正中间那一章在第 a a a 册第 b b b 章,用空格分隔。 -
样例输入 1
a1 1 -
样例输出 1
a1 1 -
样例输入 2
a12 28 31 31 30 31 30 31 31 30 31 31 30 -
样例输出 2
a7 2
思路分析
此题考察一维数组的使用,属于入门题。
首先计算出正中间章节数 s u m sum sum,然后从第一册开始依次尝试累加,如果加上当前册之后章节数超过 s u m sum sum,便确定了正中间就在当前册,再用 s u m sum sum 减去前面的总章节数便得到了正中间的章节数。
cpp
/*
* Name: T4.cpp
* Problem: 漫画书
* Author: Teacher Gao.
* Date&Time: 2026/01/26 20:28
*/
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
int n, a[105] = {0}, sum = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
}
sum = sum / 2 + 1;
int cnt = 0, x = 1;
while (cnt + a[x] < sum) cnt += a[x++];
cout << x << " " << sum - cnt << endl;
return 0;
}
T5. 实心正方形
给定一个整数 n n n,请打印一个实心的正方形,它的边界由星号 * 构成,内部由 · 填充,每条边都恰好有 n n n 个星号。
时间限制:1 s
内存限制:256 MB
-
输入
单个整数:表示 n n n, 3 ≤ n ≤ 1000 3\le n\le 1000 3≤n≤1000。 -
输出
输出一个边界为星号、内部为点的正方形。 -
样例输入 1
a5 -
样例输出 1
a***** *...* *...* *...* ***** -
样例输入 2
a3 -
样例输出 2
a*** *.* ***
思路分析
此题考察循环结构,属于入门题。
使用两层循环分别控制行和列,并检测行号和列号是否为边界,如果是边界则输出 '*',否则输出 '.'。
cpp
/*
* Name: T5.cpp
* Problem: 实心正方形
* Author: Teacher Gao.
* Date&Time: 2026/01/26 20:53
*/
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i % n <= 1 || j % n <= 1) {
cout << "*";
}
else {
cout << ".";
}
}
cout << "\n";
}
return 0;
}