題目描述
某市出租車計價規則如下:起步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
思路
貪心問題,首先看分段函數:
f(x) = 10 (x <= 4)
= 10 + (x - 4) * 2 (4 <= x <= 8)
= 18 + (x - 8) * 2.4 (x >= 8)
小於4小於8的路程簡單不多說,超過8的部分,用一個變量 remain = n - 8,如果 remain <= 4,那麼應該不下車繼續往下坐,因爲下去每裏2.4元,起步價是每裏2.5元。如果 remain >= 5,那麼應該下車分兩趟車。因爲如果總路程爲13公里,那麼分兩趟車和一趟車一樣的價格都是30元,如果總路程是14公里,則分兩趟車是32元,一趟車是32.4元。總路程16公里以內分兩趟車最省錢,而如果總路程超過16公里,那麼瘋狂-8變成少於16公里的情況處理。
代碼
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const double eps = 1e-6;
int main()
{
int n;
while (scanf("%d", &n) && n != 0) {
double sum = 0.0;
if (n <= 4) {
sum = 10.0;
} else if (n <= 8) {
sum = 10.0 + (n - 4) * 2.0;
} else {
while (n >= 8) {
sum += 18.0;
n -= 8;
}
if (n <= 4)
sum += 2.4 * n;
else
sum += 10 + (n - 4) * 2.0;
}
int tmp = (int)sum;
if (sum - tmp > eps)
printf("%.1f\n", sum);
else
cout << tmp << endl;
}
return 0;
}