简略题意:在一维坐标下,初始有一辆油量为b的车,每走1单位距离消耗1单位的油,在x=0的位置,向x=a的位置开去。在x=f的地方有一个加油站,可以把油加到b。每次从x=0到x=a或者从x=a到x=0,都记作一个行驶周期。问行驶k个周期至少需要加几次油。
注意到k很小,因此模拟就可以了。
当k=1时,若b > f && b > a - f,必然可以。
当k = 2时,需要额外判定 b > 2 * (a - f)。
当k > 2时,还需要额外判定 b > 2 * a。
若不满足上述某个条件,则必然无解。
保证有解的情况下我们就对每个周期进行模拟了。
1. 如果我们当前不能直接行驶到终点,那么我们必然还要经过至少一次加油站。在到达下一次加油站之前,如果不用加油即可,那就不加,否则加。
2. 如果当前能够直接行驶到终点,就不加油直接跑。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int a, b, f, k;
int main() {
scanf("%d%d%d%d", &a, &b, &f, &k);
if((b < 2*f && k > 2) || (b < f && k >= 1 && k <= 2) || (b < a - f && k == 1) || (2 * (a - f) > b && k >= 2)) puts("-1");
else {
int tp = 0;
int d = b;
int ans =0;
for(;;) {
if(k == 0) {
return 0 * printf("%d\n", ans);
}
if(tp == 0) {
d -= f;
if(2 * (a - f) > d) {
if(a - f <= d && k == 1) {
return 0 * printf("%d\n", ans);
} else {
d = b;
ans++;
}
}
d -= a - f;
k--;
tp ^= 1;
} else {
d -= a - f;
if(2 * f > d) {
if(f <= d && k == 1) {
return 0 * printf("%d\n", ans);
} else {
d = b;
ans++;
}
}
d -= f;
k--;
tp ^= 1;
}
}
}
return 0;
}