参考:无上阳光13的博客 穿越沙漠 acm.bit.edu.cn 1005 智力题
穿越沙漠
Problem Description
一辆吉普车来到 x 公里宽的沙漠边沿 A 点,吉普车的耗油量为 1 升 / 公里,总装油量为 500 升。通常,吉普车必须用自身油箱中的油在沙漠中设置若干个临时储油 点,才能穿越沙漠的。假设在沙漠边沿 A 点有充足的汽油可供使用,那么吉普车从 A 点穿过这片沙漠到达终点 B ,至少要耗多少升油。请编写一个程序,计算最少的 耗油量(精确到小数点后 3 位)。
( 1 )假设吉普车在沙漠中行进时不发生故障;
( 2 )吉普车在沙漠边沿 A 点到终点 B 的直线距离为 x ≧ 500 公里 ( 即沙漠宽度 ) ;
Input
输入的第一行含一个正整数 k ,表示测试例的个数。后面紧接着 k 行,每行对应一个测试例,包含一个正整数 x ,表示从 A 点到 B 点的距离( 1<=x<=2000 )。
Output
每个测试例对应一行输出,包含一个数,表示最少的油耗量(精确到小数点以后 3 位)。
Sample Input
2
500
1000
Sample Output
500.000
3836.497
这也算是一个经典的题目了。很多地方都有叙述。我就大体按照我的理解再说说好了
如果正着推导的话,呵呵,根本不可能做出来,因为我们不知道后边会发生什么东西-。-!所以只好逆推。这是最基本的思路。
所以我们可以看到了,需要在距离A点500/3的地方建造1000L的油点。建造1000L就至少跑5趟了,所以在距离B店500/5的地方需要一个1500L的C,以此类推,直到起点为止。最后处理一下起点那里边边角角的问题就好了
#include<stdio.h>
int main(){
int test_case; //测试例的个数
float dis; //AB两点之间的距离
float tem;
float i = 0;
scanf("%d",&test_case);
while(test_case--){
scanf("%f",&dis);
tem = 0;
for(i = 0;;++i){
//注意此处用500.0和int i算的结果与用float i算的不同;
tem += 500/(2*i+1);
if(tem > dis){
break;
}
}
tem = dis - tem + 500/(2*i+1);
printf("%.3f\n",500*i + tem * (2*i+1));
}
return 0;
}