codeup墓地 出租車費——貪心問題(最優解)

題目描述

某市出租車計價規則如下:起步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

C++代碼

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;

/*
 * 車費計算函數 
 */
double fee(double l){
	int n = ceil(l);
	if(n <= 4){
		return 10;
	}else if(n <= 8){
		return 10 + 2 * (n - 4);
	}else{
		return 18 + 2.4 * (n - 8);
	}
} 
/*
 * 貪心策略
 * 如果小於4公里,顯然只有算第一段,無論大小,要付10元
 * 如果在4~8公里,顯然走第二段比重新打車划算
 * 如果在8公里以上,看超出8公里多少,設超出部分爲a 
 *		計算可知:a * 2.4 ≤10 , a ≤4
 * 		(1)a ≤4
 * 			顯然走第三段划得來
 * 		(2)a > 4
 * 			顯然應該重新打車 ,從8公里處斷開重來 
 * 			
 */

int main(){
	int n;
	double total;
	while(cin >> n){
		if(n == 0){
			break;
		}
		total= 0;
		while(n > 0){
			if(n <= 12){
				total += fee(n);
				break;
			}else{
				total += fee(8);
				n -= 8;
			}
		}
		int temp = (int)total;
		if(temp - total){
			cout << fixed << setprecision(1) << total << endl;
		}else{
			cout << temp << endl;
		}
	} 
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章