当前位置:实例文章 » 其他实例» [文章][USACO14DEC] Cow Jog G 题解

[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 题解

相关标签:算法
其他信息

其他资源

Top