题解-CF2228B
洛谷CF2228B || CodeForces 2228 B
简要题意
蕾米莉亚和灵梦在一个由 \(n\) 个位置排列成圆形的跑道上。对于每个 \(1 \le i \lt n\),位置 \(i\) 和 \(i+1\) 相邻,并且位置 \(1\) 和 \(n\) 也相邻。最初,在时间 \(0\),灵梦位于位置 \(x_1\),蕾米莉亚位于位置 \(x_2\),其中 \(x_1\) 不等于 \(x_2\)。
每一回合,都会按顺序发生以下情况:
1.雷米莉亚要么移动到邻近的位置,要么留在原地。在整个游戏中,她最多可以移动到相邻位置 \(k\) 次。
2.在观察到蕾米莉亚的动作后,灵梦要么移动到邻近的位置,要么留在原地。
3.如果他们在两个动作后处于相同的位置,灵梦抓住蕾米莉亚,游戏结束。
假设她们总是以最优方法行动,即灵梦总是试图将捕捉时间最小化,而蕾米莉亚则试图将其最大化。求出灵梦抓住蕾米莉亚的回合数。
思路
当 \(n\le3\) 时,每个点和其他点的最短距离都是 \(1\),因此蕾米莉亚只能活一个回合,答案为 \(1\)。
当 \(n\ge4\) 时,她们之间的距离为 \(d=\min(|x_1-x_2|,n-|x_1-x_2|)\),因此在前 \(d-1\) 个回合中,灵梦每回合都能将距离缩短 \(1\),最后距离变为 \(1\)。然后,蕾米莉亚使用 \(k\) 次移动,反复将距离拉至 \(1\),进而再进行 \(k\) 回合,最后一回合蕾米莉亚无法移动,灵梦只需一步将其抓获,总回合数为 \(d+k\)。
#include <bits/stdc++.h>
using namespace std;
int n, x1, x2, k, t;
int main()
{
cin >>t;
while (t--)
{
cin >> n >> x1 >> x2 >> k;
if (n <= 3) cout << 1 << endl;
else cout << min(abs(x1-x2),n-abs(x1-x2))+k << endl;
}
}

浙公网安备 33010602011771号