题解:洛谷 P1422 小玉家的电费
【题目来源】
【题目描述】
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电 [2006]27 号规定,月用电量在 \(150\) 千瓦时及以下部分按每千瓦时 \(0.4463\) 元执行,月用电量在 \(151∼400\) 千瓦时的部分按每千瓦时 \(0.4663\) 元执行,月用电量在 \(401\) 千瓦时及以上部分按每千瓦时 \(0.5663\) 元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
【输入】
输入一个正整数,表示用电总计(单位以千瓦时计),不超过 \(10000\)。
【输出】
输出一个数,保留到小数点后 \(1\) 位(单位以元计,保留到小数点后 \(1\) 位)。
【输入样例】
267
【输出样例】
121.5
【核心思想】
-
问题分析:给定用电量 \(e\)(千瓦时),按阶梯电价计算电费:\(150\) 度及以下 \(0.4463\) 元/度,\(151 \sim 400\) 度部分 \(0.4663\) 元/度,\(401\) 度及以上部分 \(0.5663\) 元/度。结果保留小数点后 \(1\) 位。
-
算法选择:
- 分段计费:按用电量所在区间分三档计算,每档按对应单价计费
-
关键步骤:
- 读入数据:
cin >> e - 分段计算:
- 若
e <= 150:p = 0.4463 * e(全部按第一档) - 否则若
e <= 400:p = 0.4463 * 150 + (e - 150) * 0.4663(前150度第一档,超出部分第二档) - 否则:
p = 0.4463 * 150 + 250 * 0.4663 + (e - 400) * 0.5663(前150度第一档,250度第二档,超出部分第三档)
- 若
- 输出结果:
printf("%.1f", p)保留一位小数
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),单次判断和计算
- 空间复杂度:\(O(1)\),仅需两个变量
-
分段计费的核心思想:
- 阶梯定价模型:用电量越高,超出部分单价越高,鼓励节约用电
- 累计分段:每档费用 = 该档电量 × 该档单价,各档累加得总费用
- 边界处理:\(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
浙公网安备 33010602011771号