思路:
这题主要还是一个数学问题。所有方案中单位路费最低的情况是搭完阶段一和阶段二,平均每公里2.25元。因此将整段路程分为8公里长的小路程。最后剩下的不足8公里的部分有两种方案,要么重新计费,要么继续上一轮的计费,此后每公里为2.4元。易得这两种方案的车费分别为y = 2.4x和。当x<5时前者车费低,当x=5时两种方案的车费相等,当x>5时后者车费低。
解答:
#include <cstdio>
using namespace std;
const double eps=1e-6;
int main() {
int interval;
while(scanf("%d", &interval) != EOF) {
if(interval == 0)
break;
double cost = 0;
if(0 < interval && interval <= 8) { // 如果路程小于8
if(interval < 4)
cost = 10;
else if(4 <= interval && interval <= 8)
cost = 10 + (interval - 4) * 2.0;
}
else if(interval > 8) {
while(interval >= 8) { // 如果路程大于等于8
cost += 18; // 每8公里重新计费
interval -= 8;
}
// 如果最后不足8公里的部分小于5公里则作为前一轮的第三阶段计费,否则重新计费
if(interval < 5)
cost += 2.4 * interval;
else
cost += 10 + (interval - 4) * 2.0;
}
// 输出
if(cost - (int)cost == 0)
printf("%d\n", (int)cost);
else
printf("%.1lf\n", cost);
}
return 0;
}
坑:
一开始总是提示错误50,对照了测试输入和输出,发现我的答案和测试输出有时候会相差0.1。查了半天才发现代码总体是对的,但是cost的定义用了float导致精度不够,所以输入比较大时就产生了误差,改成double后解决。