小玉家的电费

GitHub跳转原题关系图返回列表

按用电量所在区间分段计费,最后用一位小数格式化输出。

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="")

复杂度

只做常数次判断和计算,时间复杂度 O(1)O(1),空间复杂度 O(1)O(1)

总结

分段计费的关键是“每一段只算自己负责的区间”。代码中把前面完整区间先算掉,再处理最后的超出部分,最不容易错。