问题 B: 出租车费(详细讲解)

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

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

思路:做此类思维题目不能一直思考,要动手去写。

1.if(n<=4) //此时说明就是起步价10.
2.if(n>4 && n<=8) //起步价10 + (n-4)*2;
在往后我们需要思考了,如果我们不下车一直是2.4/公里
从一开始坐车8公里需要:10 + 4*2 = 18;
而不下车继续坐车为:2.4 * 8 = 19.2;
那么如果我们需要继续坐车的路程是>=8的话,我们就换乘。
那么情况3就出来了
3.while(n>=8){
sum += 18;
n -= 8;
}
那么减完后可能是<=4
               >4 && <8
如果是<=4的话,说明最后一趟车我们不换乘,一公里2.4(换乘就变成起步价一公里2.5元,并且必须得付10块了)
如果是 >4 && <8 的话,我们令 10 + (n-4)*2  >= 2.4*n
                                 那么 n<=5
所以当 n > 4 && n <= 5的时候,不换乘继续坐
n>5 && n<8的时候,换乘。 


整理一下就是:
if(n<=4)  10
if(n>4&&n<=8) 10 + (n-4)*2
if(n>8){
       1.循环-8 sum += 18,n-=8
       if(n<=5) sum += n*2.4 
       if(n<8) sum += 10 + (n-4)*2
}

代码如下:

#include<bits/stdc++.h>

using namespace std;
//


int main(){
	int n;
	while(cin>>n&&n){
		double sum=0.0;
		if(n<=4){
		  cout<<"10"<<endl;
		  continue;	
		} 
		if(n>4 && n<=8){
		  cout<<10+(n-4)*2<<endl;
		  continue;	
		} 
		//八公里18>若继续坐8*2.4=19.2 
		//else if(n>8 && n<=12) cout<<18+2.4*(n-8)<<endl;
		while(n>=8){
			sum += 18;
			n-=8;
		}
		if(n<=5){
			sum += n*2.4;
		}
		else if(n<8){
			sum += 10 + (n-4)*2;
		}
		if(sum == (int)sum) printf("%d\n",(int)sum);
		else printf("%.1lf\n",sum);
		
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值