2923 字
15 分钟
GESP 2025年C++一级编程题解析
2025/03/22
2025/12/29

202503-1 图书馆里的老鼠#

题目描述

图书馆里有 nn 本书,不幸的是,还混入了一只老鼠,老鼠每 xx 小时能啃光一本书,假设老鼠在啃光一本书之前,不会啃另一本。请问 yy 小时后图书馆里还剩下多少本完整的书。

输入格式

三行,第一行一个正整数 nn,表示图书馆里书的数量;

第二行,一个正整数 xx,表示老鼠啃光一本书需要的时间;

第三行,一个正整数 yy,表示经过的总时间;

输入数据保证 yy 小时后至少会剩下一本完整的书。

输出格式

一行,一个整数,表示 yy 小时后图书馆里还剩下多少本完整的书。

样例输入 1

10
2
3

样例输出 1

8

样例输入 2

5
2
4

样例输出 2

3

提示

对于所有测试点,保证 1n,x,y10001\leq n,x,y\leq 1000,保证 yy 小时后至少会剩下⼀本完整的书。

代码解析

这道题易错点在于,题目所求的是还剩多少完整的书,所以对于老鼠啃的书的数量我们应该 向上取整, 注意变量的类型。

#include<bits/stdc++.h>
using namespace std;
int main() {
double n, x, y;
cin >> n >> x >> y;
cout << n - ceil(y / x);
return 0;
}

202503-2 四舍五入#

题目描述

四舍五入是一种常见的近似计算方法。现在,给定 nn 个整数,你需要将每个整数四舍五入到最接近的整十数。例如,4343 四舍五入后为 40405858 四舍五入后为 6060

输入格式

n+1n+1 行,第一行,一个整数 nn,表示接下来输入的整数个数。

接下来 nn 行,每行一个整数 a1,,ana_1, \cdots, a_n,表示需要四舍五入的整数。

输出格式

nn 行,每行一个整数,表示每个整数四舍五入后的结果。

样例输入 1

5
43
58
25
67
90

样例输出 1

40
60
30
70
90

提示

对于所有测试点,保证 1n1001\leq n\leq 1001ai100001\leq a_i\leq 10000

代码解析

数字先加 5,再除以 10,再乘以 10,即可得到四舍五入的整十数。

#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
while (n--) {
int a;
cin >> a;
cout << (a+5)/10*10 << endl;
}
return 0;
}

202506-1 假期阅读#

题目描述

小 A 有一本厚厚的书。这本书总共有 nn 页,小 A 一天中 最多只能阅读完其中的 kk 页。小 A 的假期总共有 tt 天 ,他想知道在假期中最多能阅读完这本书的多少页。

输入格式

第一行,一个正整数 nn,表示书的页数。

第二行,一个正整数 kk,表示小 A 每天最多阅读的页数。

第三行,一个正整数 tt,表示小 A 假期的天数。

输出格式

一行,一个整数,表示假期中所能阅读的最多页数。

样例输入 1

8
3
2

样例输出 1

6

样例输入 2

19
3
30

样例输出 2

19

提示

对于所有测试点,保证 n,k,tn,k,t 均不超过 10001000

代码解析

理论上可以阅读的页数大于书本的总页数,则输出书本的总页数

理论上可以阅读的页数小于书本的总页数,输出理论阅读页数

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k, t;
cin >> n >> k >> t;
if (k * t > n)
cout << n;
else
cout << k*t;
return 0;
}

202506-2 值日#

题目描述

小杨和小红是值日生,负责打扫教室。小杨每 mm 天值日一 次,小红每 nn 天值日一次。今天他们两个一起值日,请问 至少多少天后,他们会再次同一天值日?

输入格式

第一行,一个正整数 mm,表示小杨的值日周期;

第二行,一个正整数 nn,表示小红的值日周期。

输出格式

一行,一个整数,表示至少多少天后他们会再次同一天值日。

样例输入 1

4
6

样例输出 1

12

提示

对于所有测试点,保证 1m,n1001 \leq m, n \leq 100

代码解析

根据题意,需要求 m 和 n 的最小公倍数,使用枚举法即可

#include<bits/stdc++.h>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
for (int i = max(m, n); i <= m*n; i++)
if (i % m == 0 && i % n == 0) {
cout << i << endl;
break;
}
return 0;
}

202509-1 商店折扣#

题目描述

商店正在开展促销活动,给出了两种方案的折扣优惠。第一种方案是购物满 xx 元减 yy 元;第二种方案是直接打 nn 折,也就是说价格变为原先的 n/10n/10。这里的 x,y,nx, y, n 均是正整数,并且 1y<x1 \leq y < x1n<101 \leq n < 10

需要注意的是,第一种方案中满减优惠只能使用一次。例如购物满 1010 元减 33 元时,若挑选了价格总和为 3333 元的物品,只能减免 33 元,需要支付 3030 元。

小明在商店挑选了价格总和为 pp 元的物品,结账时只能使用一种优惠方案。小明最少需要支付多少钱呢?

输入格式

四行,四个正整数 x,y,n,px, y, n, p,含义见题目描述。

输出格式

一行,一个小数,表示小明最少需要支付多少钱,保留两位小数。

样例输入 1

8
7
9
10

样例输出 1

3.00

样例输入 2

8
7
2
11

样例输出 2

2.20

提示

对于所有测试点,保证 1y<x1001 \leq y < x \leq 1001n<101 \leq n < 101p1001 \leq p \leq 100

代码解析

根据题意,分别求出两种方案的价钱,输出其中最小值即可,注意只有在 p >= x 的时候才可以使用第一种方案,第二种方案算出的值是 double。

#include<bits/stdc++.h>
using namespace std;
int main() {
int x, y, n, p;
cin >> x >> y >> n >> p;
double a = 999;
if (p >= x) a = p - y;
double b = p * 0.1 * n;
cout << fixed << setprecision(2) << min(a, b);
return 0;
}

202509-2 金字塔#

题目描述

金字塔由 nn 层石块垒成。从塔底向上,每层依次需要 n×n,(n1)×(n1),,2×2,1×1n \times n, (n-1) \times (n-1), \cdots, 2 \times 2, 1 \times 1 块石块。请问搭建金字塔总共需要多少块石块?

输入格式

一行,一个正整数 nn,表示金字塔的层数。

输出格式

一行,一个正整数,表示搭建金字塔所需的石块数量。

样例输入 1

2

样例输出 1

5

样例输入 2

5

样例输出 2

55

提示

对于所有测试点,保证 1n501 \leq n \leq 50

代码解析

这道题目求的就是 1*1 + 2*2 + 3*3 +…+n*n 的值,for 循环从 1~n 不断累加 i*i 即可。

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, sum = 0;
cin >> n;
for (int i = 1;i <= n; i++)
sum += i*i;
cout << sum;
return 0;
}

202512-1 小杨的爱心快递#

题目描述

小杨是“爱心社区”的小志愿者,每周他都会帮助邻居们寄送捐赠给山区小学的文具和书籍。快递公司为了支持公益行动,制定了特殊的运费规则,鼓励大家合理包装:

假设快递的体积为 VV,重量为 GG

  • 按体积计算:运费按体积计算,公式是 0.5×V0.5 \times V 元。
  • 按重量计算:为了鼓励减轻包裹重量,规则是:当重量小于 300 克,即 G<300G < 300 时,运费为 MM 元;当重量达到或超过 300 克,即 G300G \geq 300 时,运费为 NN 元。

快递公司的叔叔说:“我们应该选择最公平合理的计费方式。”

所以,最终的运费会取按体积计算和按重量计算这两种方式中价格较低的那一个,这样对寄件人最公道。

输入格式

四行,每行一个一位小数的浮点数,分别代表,快递的体积 VV,快递的重量 GG,第一档重量运费 MM,第二档重量运费 NN

输出格式

一行一个一位小数,代表实际快递运费。

样例输入 1

100.4
300.2
60.6
70.5

样例输出 1

50.2

样例输入 2

99.8
200.9
60.2
70.1

样例输出 2

49.9

提示

样例解释

  • 对于样例 1:快递体积 VV100.4100.4,重量 GG300.2300.2,第一档重量运费 MM60.660.6,第二档重量运费 NN70.570.5

    • 若按体积收费,费用为 0.5×100.4=50.20.5 \times 100.4 = 50.2
    • 若按重量收费,由于重量 G=300.2G = 300.2 超过 300300,费用为 70.570.5
      输出价格较低的 50.250.2
  • 对于样例 2:快递体积 VV99.899.8,重量 GG200.9200.9,第一档重量运费 MM60.260.2,第二档重量运费 NN70.170.1

    • 若按体积收费,费用为 0.5×99.8=49.90.5 \times 99.8 = 49.9
    • 若按重量收费,由于重量 G=200.9G = 200.9 小于 300300,费用为 60.260.2
      输出价格较低的 49.949.9

数据范围

对于所有测试点,保证给出的浮点数均为正数,且不超过 10001000

代码解析

这道题和上次 9 月的「商店折扣」几乎一样,都是根据不同的条件计算价格,输出其中的最小值,依然考到了条件语句和保留小数位数,还是比较简单的。

#include <bits/stdc++.h>
using namespace std;
int main() {
double v, g, m, n;
cin >> v >> g >> m >> n;
double p1 = 0.5 * v;
double p2;
if (g < 300) p2 = m;
else p2 = n;
cout << fixed << setprecision(1) << min(p1, p2);
return 0;
}

202512-2 手机电量显示#

题目描述

小杨的手机就像一个聪明的小助手,当电量变化时,它会用不同的方式来提醒我们,假设当前的电量百分比为 PP

  • 当电量非常低(不超过 10,即 P10P \leq 10),它会显示一个大写字母 R,就像在说:“快给我充电吧!(Red 警告色)”
  • 当电量有点低(超过 10 但不超过 20,即 10<P2010 < P \leq 20),它会显示一个大写字母 L,意思是“电量有点 Low 啦!”
  • 当电量比较充足(超过 20,即 P>20P > 20),它就会直接显示具体的数字,比如直接显示 50,表示还有 50 的电量。

输入格式

第一行一个正整数 TT,代表数据组数。

对于每组数据,一行包含一个正整数 PP,代表手机电量百分比。

输出格式

对于每组数据,输出一行,代表当前手机显示的电量信息。

样例输入 1

5
10
1
20
99
19

样例输出 1

R
R
L
99
L

提示

样例解释

输入样例 1 共有五组数据:

  • 第一组数据手机电量 P=10P = 10,满足 P10P \leq 10,电量非常低,显示 R。
  • 第二组数据手机电量 P=1P = 1,满足 P10P \leq 10,电量非常低,显示 R。
  • 第三组数据手机电量 P=20P = 20,满足 10<P2010 < P \leq 20,电量有点低,显示 L。
  • 第四组数据手机电量 P=99P = 99,满足 P>20P > 20,电量比较充足,直接显示具体的数字 9999
  • 第五组数据手机电量 P=19P = 19,满足 10<P2010 < P \leq 20,电量有点低,显示 L。

数据范围

对于所有测试点,保证 1T201 \leq T \leq 201P1001 \leq P \leq 100

代码解析

这个也是最基础的条件语句,根据题目描述,分别判断电量是否在不同的范围内,输出对应的结果即可,注意这种题不需要一次性输出,只需要根据输入的电量判断一次,输出一次即可。

#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int p;
cin >> p;
if (p <= 10) cout << "R\n";
else if (p <= 20) cout << "L\n";
else cout << p << endl;
}
return 0;
}
GESP 2025年C++一级编程题解析
https://yezi.press/posts/gesp/gesp-cpp1-2025/
作者
Yezi 叶子
发布于
2025/03/22
许可协议
CC BY-NC-SA 4.0