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;
}