题目:
某市出租车计价规则如下:起步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;
}