题目:水龙头
时间限制:C/C++ 语言 1000MS;其他语言 3000MS
内存限制:C/C++ 语言 65536KB;其他语言 589824KB
题目描述:
小明在 0 时刻(初始时刻)将一个空桶放置在漏水的水龙头下。已知桶的容量为 H 升,并且每小时桶内的水量增加 x 升。小明每经过一个小时就会观察一次桶的水位。请计算小明第一次观察到桶内的水溢出时,距离初始时刻经过了多少小时?
输入描述:
一行输入两个整数 H 和 x (10≤H≤100, 1≤x≤20),分别表示桶的容量以及每小时桶内增加的水量,整数之间以一个空格隔开。
输出描述:
输出一个整数,表示小明第一次看到桶中的水溢出来时,距离初始时刻经过的小时数。
答案
python
运行
h, x = map(int, input().split())
hour = (h - 1) // x + 1
print(int(hour))
小明在 0 时刻(初始时刻)将一个空桶放置在漏水的水龙头下。已知桶的容量为 H 升,并且每小时桶内的水量增加 x 升。小明每经过一个小时就会观察一次桶的水位。请计算小明第一次观察到桶内的水满时,距离初始时刻经过了多少小时?
输入描述:
一行输入两个整数 H 和 x (10≤H≤100, 1≤x≤20),分别表示桶的容量以及每小时桶内增加的水量,整数之间以一个空格隔开。
输出描述:
输出一个整数,表示小明第一次看到桶中水满时,距离初始时刻经过的小时数。
降低难度:书架子上是空的,每小时放两本书,现在书架子上有十本书,请问,开始到现在一共放了几个小时?
在 C++ 中代码如下:
cpp
运行
#include <iostream>
using namespace std;
int main() {
int h, x;
cin >> h >> x;
int hour = (h - 1) / x + 1;
cout << hour << endl;
return 0;
}
详细解析
本题需要计算水溢出时经过的小时数。因为当桶内水量达到桶容量时还未溢出,要超过桶容量才会溢出。
设桶容量为H
,每小时增加水量为x
。我们可以先计算当桶差 1 升就满时经过的时间 ,即(H - 1) / x
,这里的除法在编程中如果是整数除法,会向下取整,得到不满的小时数,然后再加上 1 小时,就一定能使水溢出。
本题考点
- 基本的数学逻辑运算,理解如何根据实际问题建立数学模型来计算时间。
- 编程语言中的输入输出操作,以及基本数据类型(整数类型)的运算和处理。
知识点
- 数学建模:将实际问题转化为数学表达式进行求解,本题是根据水量变化和桶容量关系建立时间计算模型。
- 编程语言输入输出:如 Python 中的
input()
和print()
函数,C++ 中的cin
和cout
,用于与用户交互获取输入数据并输出结果。 - 整数运算:在编程中整数相除的规则(如向下取整)等。
知识点扩展内容
- 浮点数运算与精度问题:与整数运算不同,浮点数运算存在精度问题,例如在计算一些涉及小数的水量增加问题时,要注意精度控制,如
0.1 + 0.2
在计算机中并不精确等于0.3
。 - 循环结构在类似问题中的应用:除了直接用数学公式计算,也可以通过循环模拟每小时水量增加的过程,直到水溢出,虽然这种方式在本题中效率可能不如直接计算,但在更复杂的场景下有应用价值。
- 异常处理:在实际输入时,可能用户输入不符合要求(如输入非整数等),可以在代码中增加异常处理机制,让程序更加健壮。
题目 1:电梯载重
时间限制:C/C++ 1000MS;其他语言 3000MS
内存限制:C/C++ 65536KB;其他语言 589824KB
题目描述:
电梯的最大载重为 W
公斤。已知每个人的体重固定为 p
公斤,且每次最多只能载 n
人。计算电梯在不超载的情况下,最多能搭载多少人?
输入:
200 60 3
输出:
3
代码说明:
- 输入处理:读取三个整数
W
,p
,n
,分别代表电梯载重、每个人的体重和最多可载人数。 - 计算最大可能人数:
ren = W / p
,表示不考虑人数上限时能载的最多人数。 - 边界检查:如果ren 超过
n
,则取n
作为结果。 - 输出结果:直接输出最终计算的人数。
示例:
输入:
200 60 3
计算:max_possible = 200 / 60 = 3
,未超过n=3
,输出3
。输入:
200 50 2
计算:max_possible = 200 / 50 = 4
,但n=2
,输出2
。
输入描述:
一行输入三个整数 W
, p
, n
(100 ≤ W
≤ 1000, 50 ≤ p
≤ 100, 1 ≤ n
≤ 20),以空格分隔。
输出描述:
输出一个整数,表示最多能搭载的人数。
答案解析:
- 计算
max_possible = W // p
(不超过载重的最大人数)。 - 结果为
min(max_possible, n)
,因为不能超过电梯的最大容量n
。
知识点:
基础数学运算、取整、边界条件处理。
题目 2:手机充电
时间限制:C/C++ 1000MS;其他语言 3000MS
内存限制:C/C++ 65536KB;其他语言 589824KB
题目描述:
手机初始电量为 B
%,充电器每分钟能充 c
% 的电量。但手机在充电时每分钟会消耗 d
% 的电量(如使用手机)。计算手机电量首次达到或超过 100% 需要多少分钟?
输入描述:
一行输入三个整数 B
, c
, d
(0 ≤ B
≤ 99, 1 ≤ d
< c
≤ 10),以空格分隔。
输出描述:
输出一个整数,表示所需的分钟数。
样例 1
输入:
30 5 2
输出:
15
答案解析:
- 每分钟实际充电量为
net = c - d
。 - 需要补充的电量为
100 - B
,但最后一分钟可能不需要完整充电。 - 计算
time = (100 - B - 1) // net + 1
。
知识点:
数学建模、向上取整的技巧((a + b - 1) // b
)。
题目 3:书架摆放
时间限制:C/C++ 1000MS;其他语言 3000MS
内存限制:C/C++ 65536KB;其他语言 589824KB
题目描述:
书架每层高度为 h
厘米。有 n
本书,每本书的高度均为 b
厘米。计算至少需要多少层书架才能放下所有书?
输入描述:
一行输入三个整数 h
, b
, n
(10 ≤ h
≤ 100, 1 ≤ b
≤ h
, 1 ≤ n
≤ 1000),以空格分隔。
输出描述:
输出一个整数,表示所需的最少层数。
答案解析:
- 每层最多放
max_books = h // b
本书。 - 总层数为
ceil(n / max_books)
,即(n + max_books - 1) // max_books
。
知识点:
除法取整、向上取整的数学表达。
题目 4:糖果分配
时间限制:C/C++ 1000MS;其他语言 3000MS
内存限制:C/C++ 65536KB;其他语言 589824KB
题目描述:
有 n
颗糖果要分给 k
个小朋友,要求每个小朋友分到的糖果数量相同,且尽可能多。计算分完后剩余的糖果数量。
输入描述:
一行输入两个整数 n
和 k
(1 ≤ n
≤ 1000, 1 ≤ k
≤ 100),以空格分隔。
输出描述:
输出一个整数,表示剩余的糖果数。
答案解析:
- 直接计算余数
remainder = n % k
。
知识点:
取模运算的应用。
题目 5:跑步训练
时间限制:C/C++ 1000MS;其他语言 3000MS
内存限制:C/C++ 65536KB;其他语言 589824KB
题目描述:
小明每天跑步,第一天跑 d
公里,之后每天比前一天多跑 i
公里。计算小明在第 n
天跑了多少公里?
输入描述:
一行输入三个整数 d
, i
, n
(1 ≤ d
≤ 100, 1 ≤ i
≤ 10, 1 ≤ n
≤ 100),以空格分隔。
输出描述:
输出一个整数,表示第 n
天跑的公里数。
答案解析:
- 等差数列通项公式:第
n
天的距离为d + (n - 1) * i
。
知识点:
等差数列、数学公式应用。
知识点总结
- 基础数学运算:加减乘除、取整、取模。
- 边界条件处理:最大值、最小值的约束。
- 向上取整技巧:
(a + b - 1) // b
等价于ceil(a / b)
。 - 数学建模:将实际问题转化为数学公式(如等差数列)。
- 模拟计算:逐步推导过程,找到临界点(如首次溢出)。
五道填空选择作业
- 选择题:在一个容量为 10 升的桶下接水,每小时增加 2 升水,计算水溢出时小时数的表达式正确的是( )
- A.
10 / 2
- B.
(10 - 1) / 2
- C.
(10 - 1) / 2 + 1
- D.
10 / 2 + 1
- 答案:C
- A.
- 填空题:在 Python 中,获取用户输入的两个整数,用空格隔开,存储到变量
a
和b
中的代码是a, b = map(int, ____)
。- 答案:
input().split()
- 答案:
- 选择题:在 C++ 中,以下用于输入整数变量
m
和n
的代码正确的是( )- A.
scanf("%d %d", m, n);
- B.
cin >> m, n;
- C.
cin >> m >> n;
- D.
scanf("%d%d", &m, &n);
- 答案:C、D (C 是
iostream
库的输入方式,D 是stdio.h
库的输入方式 )
- A.
- 填空题:一个容量为 15 升的容器,每小时进 3 升水,水溢出时距离开始经过了____小时。
- 答案:5
- 选择题:关于整数运算,以下说法正确的是( )
- A. 整数相除结果一定是整数
- B. 整数相除会自动向上取整
- C. 整数相除会自动向下取整
- D. 整数相加可能会超出其表示范围导致错误
- 答案:C、D
题目:购物活动
时间限制:C/C++ 语言 1000MS;其他语言 3000MS
内存限制:C/C++ 语言 65536KB;其他语言 589824KB
题目描述:
某在线购物平台推出了两种优惠活动。每位顾客在同一订单中只能享受其中一种优惠。具体优惠规则如下:
1)五折优惠:顾客可以享受商品总价格的五折(即原价 ×0.5);
2)满减优惠:如果顾客购买的商品总价格达到或超过 300 元,则可以在付款时直接减免 200 元。
给定顾客一笔订单的实际支付金额,请计算该顾客可能购买的商品总价格的最大值是多少?
例如:顾客实际支付 120 元。如果他最初选择的是优惠 1),则商品的总价格为 240 元;如果他最初选择的是优惠 2),则商品的总价格为 320 元;显然,该顾客购买的商品总价格的最大值为 320 元。
输入描述:
输入一个整数 (1≤整数≤1000),表示顾客实际支付的金额。
答案
python
运行
pay = int(input())
price1 = pay * 2 # 五折优惠时的原价
price2 = pay + 200 if pay >= 100 else 0 # 满减优惠时的原价
print(max(price1, price2))
cpp
运行
#include <iostream>
using namespace std;
int main() {
int pay;
cin >> pay;
int price1 = pay * 2;
int price2 = pay >= 100? pay + 200 : 0;
cout << max(price1, price2) << endl;
return 0;
}
详细解析
- 五折优惠情况:根据五折优惠规则(原价 ×0.5 = 实际支付金额),那么通过实际支付金额反推原价,就用实际支付金额乘以 2,得到五折优惠下商品的原价
price1
。 - 满减优惠情况:满减优惠规则是商品总价达到或超过 300 元时,付款减免 200 元(即原价 - 200 = 实际支付金额)。所以反推原价就是实际支付金额加上 200 元,但前提是实际支付金额要大于等于 100 元(因为满 300 减 200,实际支付至少 100 元 ),否则不符合满减条件,此时设原价
price2
为 0。 - 最后比较两种优惠方式下得到的原价
price1
和price2
,取较大值输出,即为商品总价格的最大值。
本题考点
- 条件判断逻辑:理解不同优惠规则下的计算逻辑,通过条件判断来确定满减优惠是否适用。
- 数学运算在实际问题中的应用:根据优惠规则进行价格的正向和逆向计算。
- 编程语言的基本输入输出和数据处理:实现输入实际支付金额,经过计算后输出结果。
知识点
- 条件语句:如 Python 中的
if - else
语句,C++ 中的if - else
语句,用于判断满减优惠是否满足条件。 - 数学运算:包括乘法(五折优惠的逆运算)和加法(满减优惠的逆运算)等基本运算。
- 数据输入输出:Python 中使用
input()
获取输入,print()
输出结果;C++ 中使用cin
输入,cout
输出。
知识点扩展内容
- 多条件优惠组合:实际生活中可能存在多种优惠叠加或者更复杂的优惠规则组合,需要更复杂的条件判断和计算逻辑。比如既有折扣又有满减,且满减后还能再享受额外折扣等情况。
- 浮点数运算处理:如果涉及到小数折扣(如 6.5 折等),要注意浮点数运算的精度问题,避免因精度问题导致计算结果不准确。
- 边界值分析:对于输入输出的边界值,如本题中实际支付金额的边界 1 和 1000,以及满减优惠中 300 和 100 这些边界值,要仔细分析程序在这些边界情况下的正确性。
类似题
- 题目一
- 题目描述:某超市推出两种促销活动,顾客只能选择其中一种。活动一:商品总价打 7 折;活动二:满 200 元减 80 元。给定顾客实际支付金额,求顾客购买商品的总价最大值。
- 输入描述:输入一个整数 (1≤整数≤800),表示顾客实际支付金额。
- 输出描述:输出一个整数,表示商品总价的最大值。
- 题目二
- 题目描述:一家电商平台有两种优惠。优惠一:商品总价满 500 元打 4 折;优惠二:满 350 元减 150 元。已知顾客实际付款金额,求该顾客购买商品的最高原价。
- 输入描述:输入一个整数 (1≤整数≤1000),表示顾客实际付款金额。
- 输出描述:输出一个整数,表示商品的最高原价。
- 题目三
- 题目描述:商场推出两种优惠策略。策略一:所有商品 8.5 折;策略二:消费满 400 元减 180 元。根据顾客的实际消费金额,计算其购买商品的最大标价。
- 输入描述:输入一个整数 (1≤整数≤1200),表示顾客实际消费金额。
- 输出描述:输出一个整数,表示商品的最大标价。
- 题目四
- 题目描述:某店铺有两种优惠方式。方式一:商品总价 6 折;方式二:满 280 元减 120 元。已知顾客付款金额,求顾客购买商品的最大原价。
- 输入描述:输入一个整数 (1≤整数≤900),表示顾客付款金额。
- 输出描述:输出一个整数,表示商品的最大原价。
- 题目五
- 题目描述:在线购物平台有两种优惠活动。活动一:满 600 元,商品总价打 3.5 折;活动二:满 450 元减 220 元。根据顾客的实付金额,求顾客购买商品的最大原价。
- 输入描述:输入一个整数 (1≤整数≤1500),表示顾客实付金额。
- 输出描述:输出一个整数,表示商品的最大原价。
五道填空选择作业
- 选择题:某优惠活动是满 300 减 100,顾客实际支付 200 元,那么该顾客商品原价可能是( )
- A. 200 元
- B. 300 元
- C. 400 元
- D. 500 元
- 答案:C
- 填空题:在 Python 中,判断变量
x
是否大于 100 的语句是if ____:
。- 答案:
x > 100
- 答案:
- 选择题:C++ 中用于比较两个整数
a
和b
大小并返回较大值的函数是( )- A.
min(a, b)
- B.
max(a, b)
- C.
compare(a, b)
- D.
larger(a, b)
- 答案:B
- A.
- 填空题:某商品打 8 折后价格为 160 元,原价是____元。
- 答案:200
- 选择题:以下关于条件语句的说法正确的是( )
- A. Python 中
if - else
语句可以没有else
部分 - B. C++ 中
if - else
语句必须有else
部分 - C. 条件语句只能判断数值大小
- D. 条件语句不能嵌套使用
- 答案:A
- A. Python 中
题目描述:
端午节到了,部落联盟准备了 k 个粽子。n 个部落首领按编号 1 到 n 轮流吃粽子。每轮每人吃的粽子数等于轮次数(第 1 轮每人吃 1 个,第 2 轮每人吃 2 个,依此类推),直到吃掉最后一个粽子。吃掉最后一个粽子的首领即为获胜者。给定 n 和 k,请计算获胜的首领编号。
例如,n = 3,k = 13,吃粽子过程如下:
第一轮,1 号首领吃 1 个粽子(第 1 个),2 号首领吃 1 个粽子(第 2 个),3 号首领吃 1 个粽子(第 3 个);
第二轮,1 号首领吃 2 个粽子(第 4、5 个),2 号首领吃 2 个粽子(第 6、7 个),3 号首领吃 2 个粽子(第 8、9 个);
第三轮,1 号首领吃 3 个粽子(第 10、11、12 个),2 号首领吃掉最后一个粽子;
显然,2 号首领是获胜者。
输入描述:
一行输入两个整数 n 和 k (2≤n≤10⁵, 1≤k≤10⁹),分别表示部落首领的数量以及粽子的数量,整数间以一个空格隔开。
输出描述:
输出一个整数,表示获胜的首领编号。
答案
python
运行
n, k = map(int, input().split())
round_num = 1
while True:
eat_num = n * round_num
if k <= eat_num:
winner_index = (k - 1) // round_num + 1
print(int(winner_index))
break
k -= eat_num
round_num += 1
cpp
运行
#include <iostream>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
int round_num = 1;
while (true) {
int eat_num = n * round_num;
if (k <= eat_num) {
int winner_index = (k - 1) / round_num + 1;
cout << winner_index << endl;
break;
}
k -= eat_num;
round_num++;
}
return 0;
}
详细解析
- 首先,通过
input()
(Python)或cin
(C++)获取输入的部落首领数量n
和粽子数量k
。 - 然后进入循环,
round_num
表示轮次,初始为 1 。每一轮中,所有首领吃的粽子总数为n * round_num
。 - 在每次循环中,判断当前轮次所有首领要吃的粽子数
eat_num
是否大于剩余粽子数k
:- 如果
k <= eat_num
,说明在这一轮会决出获胜者。计算获胜首领编号的方法是:先计算出在这一轮中,从第一个首领开始数,到吃完最后一个粽子时,是第几个首领吃的,即(k - 1) // round_num + 1
(这里k - 1
是因为从 0 开始计数,//
是整数除法,在 Python 中;C++ 中是/
,因为都是整数运算 ),然后输出获胜首领编号并跳出循环。 - 如果
k > eat_num
,说明这一轮没有吃完所有粽子,那么更新剩余粽子数k -= eat_num
,并将轮次round_num
加 1,继续下一轮循环。
- 如果
本题考点
- 循环结构的运用:通过循环模拟首领们吃粽子的过程,直到粽子被吃完。
- 数学逻辑与计算:根据每轮吃粽子的数量规则,计算每轮消耗的粽子数以及确定获胜首领编号。
- 编程语言的基本输入输出和数据处理:实现输入
n
和k
,经过计算后输出获胜首领编号。
知识点
- 循环语句:Python 中的
while
循环和 C++ 中的while
循环,用于重复执行吃粽子的模拟过程。 - 数学运算:包括乘法(计算每轮吃的粽子总数)、减法(更新剩余粽子数)、除法和取整(计算获胜首领编号)等。
- 输入输出操作:Python 的
input()
和print()
,C++ 的cin
和cout
,用于数据的输入和结果的输出。
知识点扩展内容
- 优化循环效率:当
n
和k
取值很大时,当前的模拟循环方式可能效率较低。可以研究一些数学公式来提前估算大致轮次,减少循环次数。例如,通过等差数列求和公式先估算大概在第几轮能吃完粽子。 - 边界值与异常处理:考虑输入的边界值情况,如
n
和k
取最小值和最大值时程序的正确性。同时,在实际应用中,还可以增加对非法输入(如输入非整数等)的异常处理。 - 多线程模拟:如果是更复杂的模拟场景,涉及大量数据和并行操作,可以考虑使用多线程来加速模拟过程,比如在一些大型游戏的战斗模拟、资源分配模拟等场景中。
类似题
- 题目一
- 题目描述:有 m 个糖果,p 个小朋友按编号 1 到 p 轮流拿糖果。每轮每人拿的糖果数等于轮次数(第 1 轮每人拿 1 个,第 2 轮每人拿 2 个,依此类推),直到拿完最后一个糖果。拿到最后一个糖果的小朋友获胜,求获胜小朋友编号。
- 输入描述:输入两个整数 m 和 p (2≤p≤10⁵, 1≤m≤10⁹),表示糖果数量和小朋友数量,以空格隔开。
- 输出描述:输出获胜小朋友的编号。
- 题目二
- 题目描述:n 个工人按编号 1 到 n 轮流加工零件。每轮每人加工的零件数等于轮次数(第 1 轮每人加工 1 个,第 2 轮每人加工 2 个,依此类推),总共要加工 k 个零件,加工完最后一个零件的工人为完成者,求完成者编号。
- 输入描述:输入两个整数 n 和 k (2≤n≤10⁵, 1≤k≤10⁹),表示工人数和零件数,以空格隔开。
- 输出描述:输出完成者的编号。
- 题目三
- 题目描述:有 q 个礼物,r 个孩子按编号 1 到 r 轮流领礼物。每轮每人领的礼物数等于轮次数(第 1 轮每人领 1 个,第 2 轮每人领 2 个,依此类推),直到领完所有礼物。领走最后一个礼物的孩子为幸运儿,求幸运儿编号。
- 输入描述:输入两个整数 q 和 r (2≤r≤10⁵, 1≤q≤10⁹),表示礼物数量和孩子数量,以空格隔开。
- 输出描述:输出幸运儿的编号。
- 题目四
- 题目描述:t 个学生按编号 1 到 t 轮流写作业。每轮每人写的作业页数等于轮次数(第 1 轮每人写 1 页,第 2 轮每人写 2 页,依此类推),一共有 s 页作业,写完最后一页作业的学生为完成作业者,求完成作业者编号。
- 输入描述:输入两个整数 t 和 s (2≤t≤10⁵, 1≤s≤10⁹),表示学生数和作业页数,以空格隔开。
- 输出描述:输出完成作业者的编号。
- 题目五
- 题目描述:u 个运动员按编号 1 到 u 轮流跑步。每轮每人跑的圈数等于轮次数(第 1 轮每人跑 1 圈,第 2 轮每人跑 2 圈,依此类推),总共要跑 v 圈,跑完最后一圈的运动员为获胜者,求获胜者编号。
- 输入描述:输入两个整数 u 和 v (2≤u≤10⁵, 1≤v≤10⁹),表示运动员数和总圈数,以空格隔开。
- 输出描述:输出获胜者的编号。
五道填空选择作业
- 选择题:在循环中,要终止循环可以使用( )语句。
- A.
continue
- B.
break
- C.
return
- D.
pass
- 答案:B
- A.
- 填空题:在 C++ 中,从标准输入读取两个整数
a
和b
的代码是____ >> a >> b;
。- 答案:
cin
- 答案:
- 选择题:Python 中,以下计算 1 到 10 整数和的代码正确的是( )
- A.
sum = 0; for i in range(1, 11): sum += i
- B.
sum = 0; for i in range(0, 10): sum += i
- C.
sum(1, 10)
- D.
sum(range(1, 10))
- 答案:A
- A.
- 填空题:一个循环中,想跳过本次循环剩余语句,直接进入下一次循环,可以使用____语句。
- 答案:
continue
- 答案:
- 选择题:关于 C++ 中的
while
循环,以下说法正确的是( )- A.
while
循环的条件表达式必须是关系表达式 - B.
while
循环至少会执行一次循环体 - C.
while
循环中可以使用break
语句跳出循环 - D.
while
循环中不能使用if
语句 - 答案:C
- A.