按用电量所在区间分段计费,最后用一位小数格式化输出。
OJ: luogu
题目 ID: P1422
难度:入门
标签:python入门条件判断浮点
日期: 2026-07-15 18:12
题意
给出月用电量,按三段电价计算电费:
150千瓦时及以下:每千瓦时0.4463元;151..400的超出部分:每千瓦时0.4663元;401及以上的超出部分:每千瓦时0.5663元。
输出电费,保留 1 位小数。
思路
这是分段计费。按照用电量所在区间分类:
- 如果不超过
150,全部按第一段价格; - 如果不超过
400,先算前150,再算超出部分; - 否则先算前两段,再算超过
400的部分。
brute.py 不适合这题,因为分段公式就是完整解法。
Python 知识
if / elif / else适合互斥区间。- 浮点数可以直接保存单价并参与乘法。
f"{fee:.1f}"表示保留小数点后 1 位输出。- 分段计费时,不要把所有电量都按最后一段价格算,只对超出部分使用更高单价。
对应的本地 Python 笔记:
/home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:整数输入和浮点输出。/home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:控制浮点小数位数。/home/rainboy/mycode/hugo-blog/content/program_language/python/math_tools.md:浮点数注意事项。
代码
python
usage = int(input())
if usage <= 150:
fee = usage * 0.4463
elif usage <= 400:
fee = 150 * 0.4463 + (usage - 150) * 0.4663
else:
fee = 150 * 0.4463 + 250 * 0.4663 + (usage - 400) * 0.5663
print(f"{fee:.1f}", end="")cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-07-27 00:00
* update_at: 2026-07-27 00:00
*/
#include <bits/stdc++.h>
using namespace std;
int main() {
int usage; // 月用电量
cin >> usage;
double fee;
// 三段阶梯电价,每段只算自己管辖的超出的部分
if (usage <= 150) {
fee = usage * 0.4463;
} else if (usage <= 400) {
fee = 150 * 0.4463 + (usage - 150) * 0.4663;
} else {
fee = 150 * 0.4463 + 250 * 0.4663 + (usage - 400) * 0.5663;
}
// 保留 1 位小数
printf("%.1f\n", fee);
return 0;
}Pythonic 写法
match-case:
python
usage = int(input())
match usage:
case u if u <= 150:
fee = u * 0.4463
case u if u <= 400:
fee = 150 * 0.4463 + (u - 150) * 0.4663
case u:
fee = 150 * 0.4463 + 250 * 0.4663 + (u - 400) * 0.5663
print(f"{fee:.1f}", end="")match-case 写法
分段电价可用 guard 按用电量区间匹配:
python
usage = int(input())
match usage:
case u if u <= 150:
fee = u * 0.4463
case u if u <= 400:
fee = 150 * 0.4463 + (u - 150) * 0.4663
case u:
fee = 150 * 0.4463 + 250 * 0.4663 + (u - 400) * 0.5663
print(f"{fee:.1f}", end="")复杂度
只做常数次判断和计算,时间复杂度
总结
分段计费的关键是“每一段只算自己负责的区间”。代码中把前面完整区间先算掉,再处理最后的超出部分,最不容易错。