题目大意
一辆汽车从 \(0\) 到 \(a\) 往返 \(k \div 2\) 次(也就是去算一次,回算一次);原来有 \(b\) 升油,每行驶一单位距离消耗一升油,在 \(f\) 有加油站(可以加满油或者不加油);问要加多少次油;若到达不了 \(a\) 处,输出 \(-1\) ;
解题思路
要先判断是否能用 \(b\) 升油走到加油站。
不能就永远到不了,直接结束了。
如果能:
以加油站为分点,将这段路分为两段;
第一段:
去:如果能不加油到终点再走回来,就不加油;否则就加油。
回:同理。
注意每次都要判断到加油站的距离不能小于零。
代码如下:
int first(int a,int b,int f,int k) {
for(int i=1; i<=k-1; i++) {
if(i%2==1) {
if(sum>=2*(a-f))sum-=2*(a-f);
else {
sum=b-2*(a-f);
ans++;
if(sum<0) {
cout<<"-1";
exit(0);
}
}
}
else {
if(sum>=2*f)sum-=2*f;
else {
sum=b-2*f;
ans++;
if(sum<0) {
cout<<"-1";
exit(0);
}
}
}
}
}
第二段:
与第一段同理。
注意每次也都要判断到加油站的距离不能小于零。
代码如下:
int second(int a,int b,int f,int k) {
if(k%2==1) {
if(sum<(a-f)) {
sum=b-(a-f);
ans++;
if(sum<0) {
cout<<"-1";
exit(0);
}
}
}
else {
if(sum<f) {
sum=b-f;
ans++;
if(sum<0) {
cout<<"-1";
exit(0);
}
}
}
}
注意一个地方:
在这里
,return 0
就是退出这个函数,而不是返回这个程序,用 exit(0)
相当于在 main
里 return 0
(感谢 kuailedetongnian 的提醒)。