codeforces 864C 模拟

本文介绍了一种在一维坐标系中模拟车辆行驶并计算加油次数的算法。考虑到车辆初始油量、目标位置、加油站位置及行驶周期数,通过判断不同情况下的可达性和油量补给策略来求解最少加油次数。

简略题意:在一维坐标下,初始有一辆油量为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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值