[常州市赛 2022] 阶梯电价 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求计算某个月的电费,即根据年度阶梯电价标准,计算从电量 u 到 v 的增量费用。核心解法是先定义累计电费函数 F(x),表示年度用电量为 x 度时的总电费,则本月电费为 F(v)-F(u)。

分析
核心观察

阶梯电价按年度累计用电量分段计价,不同区间的单价不同。本月电费只取决于上月底累计用电量 u 和本月底累计用电量 v,等于年度总电费在这两个点的差值。

思路

设年度累计用电量为 x(非负整数),累计电费 F(x) 按以下分段函数计算:

  • 若 0 \le x \le 2760,F(x) = x \times 0.52;
  • 若 2760 < x \le 4800,F(x) = 2760 \times 0.52 + (x - 2760) \times 0.57;
  • 若 x > 4800,F(x) = 2760 \times 0.52 + (4800 - 2760) \times 0.57 + (x - 4800) \times 0.82。

本月电费即为 F(v) - F(u),其中 u \le v。

具体示例

样例中 u=2700,v=5000:

  • F(2700) = 2700 \times 0.52 = 1404;
  • F(5000) = 2760 \times 0.52 + (4800-2760) \times 0.57 + (5000-4800) \times 0.82 = 1435.2 + 1162.8 + 164 = 2762;
  • 差值 2762 - 1404 = 1358,输出 1358.00。
算法步骤
  1. 读取上月底读数 u 和本月底读数 v。
  2. 定义函数 calc(x),根据 x 所在区间计算累计电费。
  3. 计算 ans = calc(v) - calc(u)。
  4. 输出 ans,保留 2 位小数。
复杂度分析
  • 时间:O(1)
  • 空间:O(1)
实现注意事项
  • 费用可能为浮点数,需使用 double 类型存储。
  • 输出时需保留两位小数,可使用 cout << fixed << setprecision(2) 或 printf("%.2f")。
  • 输入数据范围 0 \le u \le v \le 10^4,电量较小,计算不会溢出。
  • 注意阶梯边界值(2760、4800)的归属:在分段条件中使用 <= 或 > 需保持一致。
源代码
#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}")

评论

目前没有评论。