[常州市赛 2022] 阶梯电价 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求计算某个月的电费,即根据年度阶梯电价标准,计算从电量 到
的增量费用。核心解法是先定义累计电费函数
,表示年度用电量为
度时的总电费,则本月电费为
。
分析
核心观察
阶梯电价按年度累计用电量分段计价,不同区间的单价不同。本月电费只取决于上月底累计用电量 和本月底累计用电量
,等于年度总电费在这两个点的差值。
思路
设年度累计用电量为 (非负整数),累计电费
按以下分段函数计算:
- 若
,
;
- 若
,
;
- 若
,
。
本月电费即为 ,其中
。
具体示例
样例中 ,
:
;
;
- 差值
,输出
。
算法步骤
- 读取上月底读数
u和本月底读数v。 - 定义函数
calc(x),根据x所在区间计算累计电费。 - 计算
ans = calc(v) - calc(u)。 - 输出
ans,保留位小数。
复杂度分析
- 时间:
- 空间:
实现注意事项
- 费用可能为浮点数,需使用
double类型存储。 - 输出时需保留两位小数,可使用
cout << fixed << setprecision(2)或printf("%.2f")。 - 输入数据范围
,电量较小,计算不会溢出。
- 注意阶梯边界值(
、
)的归属:在分段条件中使用
<=或>需保持一致。
源代码
#include <iostream>
#include <iomanip>
using namespace std;
double calc(int x) {
if (x <= 2760) {
return x * 0.52;
} else if (x <= 4800) {
return 2760 * 0.52 + (x - 2760) * 0.57;
} else {
return 2760 * 0.52 + (4800 - 2760) * 0.57 + (x - 4800) * 0.82;
}
}
int main() {
int u, v;
cin >> u >> v;
double ans = calc(v) - calc(u);
cout << fixed << setprecision(2) << ans << endl;
return 0;
}
def calc(x):
if x <= 2760:
return x * 0.52
elif x <= 4800:
return 2760 * 0.52 + (x - 2760) * 0.57
else:
return 2760 * 0.52 + (4800 - 2760) * 0.57 + (x - 4800) * 0.82
u, v = map(int, input().split())
ans = calc(v) - calc(u)
print(f"{ans:.2f}")
评论