《算法笔记》codeup_100000584 问题 B: 出租车费

思路:

这题主要还是一个数学问题。所有方案中单位路费最低的情况是搭完阶段一和阶段二,平均每公里2.25元。因此将整段路程分为8公里长的小路程。最后剩下的不足8公里的部分有两种方案,要么重新计费,要么继续上一轮的计费,此后每公里为2.4元。易得这两种方案的车费分别为y = 2.4x和y=\begin{cases} &10\qquad\qquad\qquad\, ,0< x\leq 4 \\ &10+2\left ( x-4 \right )\quad ,4< x \leq 8\\ &18+2.4\left ( x-8 \right )\,\,,8< x \end{cases}。当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后解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值