Cannon Ball (USACO Bronze 2024 January)

Cannon Ball (USACO Bronze 2024 January)

在数轴上跳跃,踩中目标不改变方向和速度,踩中跳板改变方向,速度加上跳板的值,问最终踩中目标的个数。

这个看起来直接模拟就行了,因为如果跳板不断加速的话,最终比较快就会出界,就结束了。唯一的复杂性, 是跳板的能量可能为0,这样的话可能会带来死循环。所以我们需要记录下每个位置的状态,如果某个位置的状态重复了,就说明进入了死循环。

#include <cstdio>
#include <algorithm>
#include <functional>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
 
int n;
int q[100005], v[100005];
int p, s=1; // pos and speed
int last[100005];
int ans;
 
int main() {
    scanf("%d %d", &n, &p);
    for (int i = 1; i <= n; i++)
        scanf("%d %d", &q[i], &v[i]);
    
    while (1) {
        if (p < 1 || p > n)
            break;
        // check for repeats
        if (last[p] == s)
            break;
        last[p] = s;
        if (q[p] == 1 && abs(s) >= v[p]) {
            q[p] = 2;
            ans++;
        }
        if (q[p] == 0) {
            s = -s;
            if (s > 0)
                s += v[p];
            else
                s -= v[p];
        }
        p += s;
    }
    printf("%d", ans);
 
    return 0;
}