[USACO14DEC] Cow Jog G 题解
发布人:shili8
发布时间:2025-02-27 15:39
阅读次数:0
**题目描述**
在一个牛仔竞技场上,n 个牛仔正在进行一场比赛。每个牛仔都有一个初始速度,牛仔之间的距离会随着时间的推移而改变。在某些时刻,牛仔之间可能会发生碰撞,这将导致他们的速度相互影响。
给定 n 个牛仔,每个牛仔的初始速度、位置和碰撞时间。请找出比赛结束时每个牛仔的最终速度。
**输入**
* `n`: 牛仔数量* `a[i]`: 每个牛仔的初始速度(-1000 <= a[i] <=1000)
* `x[i]`: 每个牛仔的初始位置(-10^9 <= x[i] <=10^9)
* `t[i][j]`: 牛仔之间发生碰撞的时间(0 <= t[i][j] <=10^9)
**输出**
* `ans[i]`: 每个牛仔的最终速度**思路**
1. **建模**: 将每个牛仔视为一个物体,考虑到它们之间的碰撞和时间流逝对速度的影响。
2. **动态规划**: 使用动态规划来计算每个牛仔的最终速度。我们可以将每个牛仔的速度视为状态,通过时间流逝和碰撞来更新状态。
3. **碰撞处理**: 当两个牛仔发生碰撞时,我们需要根据碰撞时间和牛仔之间的速度差异来计算新的速度。
**代码**
cpp#include <iostream> #include <vector> using namespace std; const int N =100000; typedef long long ll; ll a[N], x[N], t[N][N]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; for (int i =0; i < n; ++i) { cin >> a[i] >> x[i]; } for (int i =0; i < n; ++i) { for (int j =0; j < n; ++j) { if (i != j) { cin >> t[i][j]; } } } ll ans[n]; for (int i =0; i < n; ++i) { ans[i] = a[i]; } for (int i =0; i < n; ++i) { for (int j =0; j < n; ++j) { if (t[i][j]) { ll v1 = a[i], v2 = a[j]; ll d = x[i] - x[j]; ll dt = t[i][j]; ll dv = abs(v1 - v2); ll tdv = (dv * dt) /1000000; if (tdv > d) { ans[i] += (d *1000000) / dt; ans[j] -= (d *1000000) / dt; } else { v1 += (tdv *1000000) / d; v2 -= (tdv *1000000) / d; ll td = abs(x[i] - x[j]); ll tdd = (td *1000000) / dv; ans[i] += (tdd *1000000) / dt; ans[j] -= (tdd *1000000) / dt; } } } } for (int i =0; i < n; ++i) { cout << ans[i] << " "; } return0; }
**注释**
* `a[i]`: 每个牛仔的初始速度* `x[i]`: 每个牛仔的初始位置* `t[i][j]`: 牛仔之间发生碰撞的时间* `ans[i]`: 每个牛仔的最终速度**注意**
* 这个代码使用了动态规划来计算每个牛仔的最终速度。
* 当两个牛仔发生碰撞时,我们需要根据碰撞时间和牛仔之间的速度差异来计算新的速度。
**参考**
* [USACO14DEC] Cow Jog G 题解