问题描述
在一条繁忙的道路上,多辆汽车经过。运行模拟以查看如果道路上的所有汽车都刹车失灵会发生什么。确保它们安全的唯一方法是它们不会相互碰撞和擦身而过。目标是确定任何给定的汽车是否会在环形交叉路口安全地相互碰撞或擦身而过。将此视为参考点 O(坐标为 (0, 0) 的原点),但汽车并没有绕过它,而是通过它。
考虑到每辆车都以各自匀速的直线向原点移动。即使在越过起点后,汽车仍将继续沿同一条直线行驶。计算在这种情况下会发生的碰撞次数。
注意:仅在原点计算碰撞。忽略其他碰撞。假设每辆车即使在碰撞后仍继续沿各自的路径行驶,而不会改变方向或速度,并持续无限远。
给定一个数组car[] ,其中包含每个元素的坐标及其速度。找出原点碰撞的总数。
例子:
Input: car[] = {(5 12 1), (16 63 5), (-10 24 2), (7 24 2), (-24 7 2)}
Output: 4
Explanation:
Let the 5 cars be A, B, C, D, and E respectively.
4 Collisions are as follows –
A & B, A & C, B & C, D & E
方法:这个想法是找到在原点碰撞的汽车数量。我们给出了汽车的坐标位置,从中我们可以找到汽车与原点的距离。
设 x, y 为汽车的位置,则距原点的距离为:
将此距离除以速度将给我们提供汽车在原点出现的时间。因此,如果在某个时刻有“N”辆车出现在原点,那么总碰撞将是
在不同的时间实例添加所有碰撞将给出我们需要的答案。
下面是上述方法的实现:
C++
// C++ implementation to find the
// collision at the origin
#include
using namespace std;
// Structure to store the
// co-ordinates of car and speed
struct Car {
long long x;
long long y;
long long v;
};
// Function to find the co-ordinates
// of the car and speed
long long solve(long long c,
vector& arr)
{
map freq;
long sum = 0;
for (long long i = 0; i < c; i++) {
long long x = arr[i].x,
y = arr[i].y,
v = arr[i].v;
long long dist_square
= (x * x) + (y * y);
long long time_square
= dist_square / (v * v);
freq[time_square]++;
}
// Loop to iterate over the
// frequency of the elements
for (auto it = freq.begin();
it != freq.end(); it++) {
long long f = it->second;
if (f <= 0)
continue;
sum += (f * (f - 1)) / 2;
}
return sum;
}
// Driver Code
int main()
{
long long c = 5;
vector arr;
Car tmp;
tmp.x = 5;
tmp.y = 12;
tmp.v = 1;
arr.push_back(tmp);
tmp.x = 16;
tmp.y = 63;
tmp.v = 5;
arr.push_back(tmp);
tmp.x = -10;
tmp.y = 24;
tmp.v = 2;
arr.push_back(tmp);
tmp.x = 7;
tmp.y = 24;
tmp.v = 2;
arr.push_back(tmp);
tmp.x = -24;
tmp.y = 7;
tmp.v = 2;
arr.push_back(tmp);
cout << solve(c, arr);
return 0;
}
4
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live