问题 B: 出租车费
时间限制: 1 Sec 内存限制: 32 MB
提交: 915 解决: 314
[提交][状态][讨论版][命题人:外部导入]
题目描述
某市出租车计价规则如下:起步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
假设路程为l
0<l<=4时 价格为10元 平均2.5元
4<l<8时 价格为10+(l-4)*2元 l=5 对应2.4元 l=6对应2.33 l=7对应 2.28元
当l=8时,我们可以计算一下,如果重新坐一次车,前8公里平均下来每公里是18元/8公里=2.25元/公里
而我们不换乘,每公里是2.4元
因此当l>8时,就选择换乘,只出前8公里的18元钱,因为均价最低
因为我们是不断的将l-8,所有总有一次换乘,正好l<8
这时我们又有两种选择
一是接着坐2.4元/公里 一是换乘从2.5元/公里开始
我们从上面对应的每公里的价格可以看出
l<=4时,我们换乘的话就要花2.5每公里,但是实际是没有必要的,我们继续坐只要2.4元每公里,所以选择继续坐
而4<l<8时,我们可以看出l=5时是2.4元/公里,之后依次递减,已经小于了继续坐的价格,因此我们选择换一辆坐
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int distance;
while(scanf("%d",&distance)!=EOF){
if(!distance) break;
double price=0;
if(distance<=4){
price+=10;
}
if(distance>4&&distance<=8){
price+=10+(distance-4)*2;
}
if(distance>8){
while(distance>=8){ //如果可以换乘则一直换乘
price+=18;
distance=distance-8;
}
if(distance<=4){ //此时接着坐划算
price+=distance*2.4;
}
else{ //此时换乘划算
price+=10+(distance-4)*2;
}
}
if(price-(int)price!=0) //如果是小数就输出小数
printf("%.1lf\n",price);
else
printf("%d\n",(int)price);
}
return 0;
}