题解:P1422 小玉家的电费
GoldenSTEVE7 · · 题解
思路
这是一道典型的分段计费问题。我们跟着题目条件来,设输入的数为
- 若
n \le 150 ,则S = n \times 0.4463 。 - 若
150 < n \le 400 ,则S = 150 \times 0.4463 + (n - 150) \times 0.4663 。 - 若
400 < n ,则S = 150 \times 0.4463 + 250 \times 0.4663 + (n - 400) \times 0.5663 。
总结一下,分段计费问题的核心思路就是分段讨论。(就像你七年级学的零点分段)
还有个问题就是四舍五入到小数点后一位,我们把这个过程形式化地写下来。设待进行四舍五入的小为
- 若
100a \bmod 10 < 5 ,a' = [10a]\div 10 。 - 若
100a \bmod 10 \ge 5 ,a' = [10a+1]\div 10 。
其中,
其实,上述过程可以简化为
请大家牢记这种东西,因为如果你在这种地方出现错误,那就是非常可惜了。
代码
#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;
}