题解:洛谷 P1422 小玉家的电费

【题目来源】

洛谷:P1422 小玉家的电费 - 洛谷

【题目描述】

夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电 [2006]27 号规定,月用电量在 \(150\) 千瓦时及以下部分按每千瓦时 \(0.4463\) 元执行,月用电量在 \(151∼400\) 千瓦时的部分按每千瓦时 \(0.4663\) 元执行,月用电量在 \(401\) 千瓦时及以上部分按每千瓦时 \(0.5663\) 元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。

【输入】

输入一个正整数,表示用电总计(单位以千瓦时计),不超过 \(10000\)

【输出】

输出一个数,保留到小数点后 \(1\) 位(单位以元计,保留到小数点后 \(1\) 位)。

【输入样例】

267

【输出样例】

121.5

【核心思想】

  1. 问题分析:给定用电量 \(e\)(千瓦时),按阶梯电价计算电费:\(150\) 度及以下 \(0.4463\) 元/度,\(151 \sim 400\) 度部分 \(0.4663\) 元/度,\(401\) 度及以上部分 \(0.5663\) 元/度。结果保留小数点后 \(1\) 位。

  2. 算法选择

    • 分段计费:按用电量所在区间分三档计算,每档按对应单价计费
  3. 关键步骤

    • 读入数据cin >> e
    • 分段计算
      • e <= 150p = 0.4463 * e(全部按第一档)
      • 否则若 e <= 400p = 0.4463 * 150 + (e - 150) * 0.4663(前150度第一档,超出部分第二档)
      • 否则:p = 0.4463 * 150 + 250 * 0.4663 + (e - 400) * 0.5663(前150度第一档,250度第二档,超出部分第三档)
    • 输出结果printf("%.1f", p) 保留一位小数
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),单次判断和计算
    • 空间复杂度:\(O(1)\),仅需两个变量
  5. 分段计费的核心思想

    • 阶梯定价模型:用电量越高,超出部分单价越高,鼓励节约用电
    • 累计分段:每档费用 = 该档电量 × 该档单价,各档累加得总费用
    • 边界处理\(151 \sim 400\) 档的基数是150而非151,因150度已按第一档计完
    • 适用于阶梯计价、分段函数、费用计算类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int e;                // 定义变量:用电量e(千瓦时)
    double p;             // 定义变量:电费p(元)

    cin >> e;             // 输入用电量

    // 分段计算电费
    if (e <= 150)
    {
        // 第一档:≤150千瓦时,单价0.4463元
        p = 0.4463 * e;
    }
    else if (e <= 400)
    {
        // 第二档:151-400千瓦时
        // 前150度按第一档,超出部分按0.4663元
        p = 0.4463 * 150 + (e - 150) * 0.4663;
    }
    else
    {
        // 第三档:>400千瓦时
        // 前150度按第一档,250度按第二档,超出部分按0.5663元
        p = 0.4463 * 150 + 250 * 0.4663 + (e - 400) * 0.5663;
    }

    // 输出电费(保留1位小数)
    printf("%.1f", p);

    return 0;            // 程序正常结束
}

【运行结果】

267
121.5
posted @ 2026-08-05 15:45  团爸讲算法  阅读(28)  评论(0)    收藏  举报