[codeup] 1128 出租車費
阿新 • • 發佈:2019-02-16
相同 tmp mes else if using 安排 str lse return
題目描述
某市出租車計價規則如下:起步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; }
[codeup] 1128 出租車費