专栏文章

题解:P1422 小玉家的电费

P1422题解参与者 5已保存评论 6

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
6 条
当前快照
1 份
快照标识符
@mipbmtba
此快照首次捕获于
2025/12/03 09:21
3 个月前
此快照最后确认于
2025/12/03 09:21
3 个月前
查看原文

思路

这是一道典型的分段计费问题。我们跟着题目条件来,设输入的数为 nn,所交电费为 SS,分以下三种情况讨论:
  • n150n \le 150,则 S=n×0.4463S = n \times 0.4463
  • 150<n400150 < n \le 400,则 S=150×0.4463+(n150)×0.4663S = 150 \times 0.4463 + (n - 150) \times 0.4663
  • 400<n400 < n,则 S=150×0.4463+250×0.4663+(n400)×0.5663S = 150 \times 0.4463 + 250 \times 0.4663 + (n - 400) \times 0.5663
总结一下,分段计费问题的核心思路就是分段讨论。(就像你七年级学的零点分段
还有个问题就是四舍五入到小数点后一位,我们把这个过程形式化地写下来。设待进行四舍五入的小为 aa,答案为 aa'
  • 100amod10<5100a \bmod 10 < 5a=[10a]÷10a' = [10a]\div 10
  • 100amod105100a \bmod 10 \ge 5a=[10a+1]÷10a' = [10a+1]\div 10
其中,[a][a] 表示 aa 向下取整。
其实,上述过程可以简化为
a=[10a+0.5]÷10a' = [10a+0.5] \div 10
请大家牢记这种东西,因为如果你在这种地方出现错误,那就是非常可惜了。

代码

CPP
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n; cin >> n;
    double b = 0;
    if(n <= 150) { // 讨论,求解答案
        b = n * 0.4463;
    } else if(n > 150 && n <= 400) {
        b = 150 * 0.4463 + (n - 150) * 0.4663;
    } else {
        b = 150 * 0.4463 + 250 * 0.4663 + (n - 400) * 0.5663;
    } cout << floor(b * 10 + 0.5) / 10.0; // 四舍五入
    return 0;
}

评论

6 条评论,欢迎与作者交流。

正在加载评论...