出租车费

题目描述

某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里;接下来的4公里,每公里2元;之后每公里2.4元。行程的最后一段即使不到1公里,也当作1公里计费。
一个乘客可以根据行程公里数合理安排坐车方式来使自己的打车费最小。
例如,整个行程为16公里,乘客应该将行程分成长度相同的两部分,每部分花费18元,总共花费36元。如果坐出租车一次走完全程要花费37.2元。
现在给你整个行程的公里数,请你计算坐出租车的最小花费。

输入

输入包含多组测试数据。每组输入一个正整数n(n<10000000),表示整个行程的公里数。
当n=0时,输入结束。
输出
对于每组输入,输出最小花费。如果需要的话,保留一位小数。

样例输入 Copy

3
9
16
0

样例输出 Copy

10
20.4
36

思路

在这里插入图片描述

完整代码

#include<stdio.h>
#include<algorithm>
using namespace std;
const double eps = 1e-6;
int main() {
	int n;
	while(scanf("%d",&n),n) {
		if(n <= 4) {//路程不满4
			printf("10\n");
			continue;
		}
		if(n <= 8 ) {//路程不满8
			printf("%d\n",10 + (n - 4)*2);
			continue;
		}
		if(n <= 12 ) {//路程不满12
			double m = 18 + (n - 8)*2.4;
			int n = m;
			if( m - n < eps)
				printf("%d\n",n);
			else
				printf("%.1lf\n",m);
			continue;
		}
		double sum = 0;
		while( n >= 8) {//8公里最合适
			sum +=	18;
			n -= 8;
		}
		if(n <= 4) {
			sum +=(2.4 * n);
		} else {
			sum +=(10+(n-4)*2);
		}
		int temp = sum;
		if( sum - temp < eps)
			printf("%d\n",temp);
		else
			printf("%.1lf\n",sum);
	}

}

优化

仔细查看代码会发现,其实不需要写公里数在[8,12]之间的判断
因为下面的循环之后有判断,到底剩余的有没有超过4

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
 
int main() {
	int n;
	while (scanf("%d", &n) == 1 && n > 0) {
		if (n <= 4) {
			printf("10\n");
			continue;
		} 
		if (n <= 8) {
			printf("%d\n", 10 + (n - 4)*2);
			continue;
		}
		
		double s = 0.0;
		while (n >= 8) {
			s += 18;
			n -= 8;
		}
		
		if (n <= 4) {
			s += 2.4 * n;
		}
		else if (n <= 8) {
			s += (n - 4)*2 + 10;
		}
		
		int tmp = s;
		if (s-tmp < eps) printf("%d\n", tmp);
		else printf("%.1lf\n", s);
	}
	return 0;
}
posted @ 2021-03-06 09:50  我就是隔壁老张  阅读(165)  评论(0编辑  收藏  举报