题目描述

某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里;接下来的4公里,每公里2元;之后每公里2.4元。行程的最后一段即使不到1公里,也当作1公里计费。
一个乘客可以根据行程公里数合理安排坐车方式来使自己的打车费最小。
例如,整个行程为16公里,乘客应该将行程分成长度相同的两部分,每部分花费18元,总共花费36元。如果坐出租车一次走完全程要花费37.2元。
现在给你整个行程的公里数,请你计算坐出租车的最小花费。

 

输入

输入包含多组测试数据。每组输入一个正整数n(n<10000000),表示整个行程的公里数。
当n=0时,输入结束。

输出

对于每组输入,输出最小花费。如果需要的话,保留一位小数。

样例输入

3
9
16
0

样例输出

10
20.4
36

 

本题刚开始误解了题意,事实上那个不满一公里是指某次乘车的总行驶公里数<1km算作1km,而实际上<1km就是10元

之后的>1km还是按照正常的计价规则进行,故此条件可以忽略

这里需要注意的是每次的公里数如果大于8,那么就可以进行一次10+8(初始4公里+4公里乘2元)

因为之后的是2.4元每公里,故这里这样是比较划算的

假设n公里

那么剩下n剩 = n-(int)n/8

n剩公里该如何抉择呢?(注意:这里的n剩是小于8的哦)

我们需要去比较到底是重新坐车划算还是继续2.4元划算

那就是比较10+(n剩-4)*2 == 2.4n剩    得n剩 = 5

即当n剩<=5时,选择继续坐车划算,当n剩大于5时,选择重新坐车划算

贴个代码:

#include<stdio.h>
int main()
{
    double dis, all;
    while(~scanf("%lf", &dis) && dis){ 
        all = 0;
        if(dis <= 4)
            all = 10;
        else if(dis <= 8)
            all = 10 + (dis-4)*2;
        else if(dis > 8){ 
            if(dis >= 8){
            	int t = dis / 8;
                all = all + 18 * t;
                dis = dis - 8 * t;
            }
            if(dis <= 5)
                all = all + 2.4 * dis;
            else
                all = all + 10 + (dis-4) * 2;
        }
        if(all == (int)all)
            printf("%d\n", (int)all);
        else
            printf("%.1lf\n", all);
    } 
    return 0;
}