用c++实现甲乙两人在相距100米的直线上来回慢跑,甲每秒跑2.6米,乙每秒跑2.4米,他们分别在直线两端同时出发,问两人在这段直线第n(0<n<10000)次相遇时,两人慢跑了多少秒钟
时间: 2023-11-30 17:03:13 浏览: 119
这道题可以使用双指针的思想来解决。
假设甲乙两人同时出发时,甲在左端点,乙在右端点,他们向对面慢跑。当他们第一次相遇时,设此时甲跑了 $a$ 秒,乙跑了 $b$ 秒,则有 $2.6a+2.4b=100$。注意到 $a$ 和 $b$ 的值是相等的,因为他们是同时出发的。所以我们可以得到 $a+b=100/5=20$。
接下来,我们考虑第二次相遇。此时,甲和乙都已经跑了 $20$ 秒,甲在右端点,乙在左端点,他们向对面慢跑。当他们第二次相遇时,设此时甲跑了 $a'$ 秒,乙跑了 $b'$ 秒,则有 $2.6a'+2.4b'=100$。注意到 $a'$ 和 $b'$ 的值也是相等的,因为他们是同时出发的。所以我们可以得到 $a'+b'=100/5=20$。
通过观察上面的式子,我们可以发现,对于第 $n$ 次相遇,我们都有 $a_n+b_n=20$。因此,我们可以使用双指针,同时维护甲和乙的位置,每次移动一步(即 $2.6$ 米或 $2.4$ 米),直到他们相遇 $n$ 次为止。在此过程中,我们记录甲移动的总时间 $t_a$,即 $t_a = a_1+a_2+\cdots+a_n$,也就是甲慢跑的总时间。乙的总时间也是同理。
以下是 C++ 代码实现:
```
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int total_distance = 100; // 直线总长度
double a_speed = 2.6; // 甲的速度
double b_speed = 2.4; // 乙的速度
int a_pos = 0; // 甲的位置
int b_pos = total_distance; // 乙的位置
int meet_count = 0; // 相遇次数
double a_time = 0; // 甲跑的总时间
double b_time = 0; // 乙跑的总时间
while (meet_count < n) {
// 计算甲和乙下一次相遇的时间
double a_next_time = (b_pos - a_pos) / (a_speed + b_speed);
double b_next_time = (a_pos + b_pos) / (a_speed + b_speed);
// 更新甲和乙的位置
a_pos += a_speed * a_next_time;
b_pos -= b_speed * a_next_time;
// 累加甲和乙跑的总时间
a_time += a_next_time;
b_time += a_next_time;
// 如果甲和乙在同一位置,相遇次数加一
if (a_pos == b_pos) {
meet_count++;
}
}
cout << "甲慢跑的总时间:" << a_time << "秒" << endl;
cout << "乙慢跑的总时间:" << b_time << "秒" << endl;
return 0;
}
```
注意,由于浮点数计算存在精度误差,所以我们不能直接用 $a+b=20$ 来判断两个时间是否相等,而是需要判断它们的差是否小于一个极小的数,例如 $1e-9$。
阅读全文