题目链接:http://codeup.cn/problem.php?cid=100000584&pid=1
题目描述
某市出租车计价规则如下:起步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
思路
(1)cost = 10 x < = 4 2.5元/米
(2)cost = 10 + 2*(x-4) 4<x<=8 约 2.25元/米
(3)cost = 10 + 2*(8-4)+(x-8)*2.4 = 18 +(x-8)*2.4 x>8 超8元的约2.4元每米
故
应优先选择(2)
其次选择(3)
n>8时:
- 先求n中有多少个8,这部分取(2)
- 看余下的里程与4比较, 如果大于4取(2); 小于等于4,取2.4*(n-8);
-
#include<stdio.h> #include<algorithm> using namespace std; const int maxn = 110; const double eps=1e-6; int main(){ int n; while(scanf("%d",&n),n!=0) { double sum=0; int flag = 1; if(n<=4) sum=10; else if(n>4&&n<=8) sum=2*n+2; else{ sum = sum + (n/8)*18; n = n % 8; if(n>4) { sum+=(2*n+2); } else{ sum = sum + n*2.4; } } if(sum-(int)sum==0) printf("%d\n",(int)sum); else printf("%.1lf\n",sum); } } /* 3 1 4 2 6 5 7 运行结果 2 */