AT_sumitb2019_f Interval Running的题解
洛谷传送门
AT传送门
题目大意
有甲、乙两人在一条无限长度的跑道上跑步,在开始 T 1 T_1 T1 分钟内甲的速度为 A 1 A_1 A1 ,乙的速度为 B 1 B_1 B1 ,再之后 T 2 T_2 T2 分钟内甲、乙的速度分别为 A 2 A_2 A2 、 B 2 B_2 B2 ,再之后 T 1 T_1 T1 分钟内甲、乙的速度分别为 A 1 A_1 A1、 B 1 B_1 B1 ⋯ \cdots ⋯ ⋯ \cdots ⋯ 如此交替往复。问甲乙两人有多少次相遇,若一直可以相遇则输出 infinity。
思路
先输入 T 1 T_1 T1, T 2 T_2 T2, A 1 A_1 A1, A 1 A_1 A1, B 1 B_1 B1, B 2 B_2 B2。然后计算在 T 1 T1 T1 秒时,甲乙的距离,在 T 2 T2 T2 秒时,甲乙的距离。然后再判断相遇。
代码
#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {
inline int read() {
register int x = 0, f = 1;
register char c = getchar();
while (c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
inline void write(int x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
return;
}
}
using namespace fastIO;
int main() {
ll t1, t2, a1, a2, b1, b2;
cin >> t1 >> t2 >> a1 >> a2 >> b1 >> b2;
ll x = (a1 - b1) * t1; // 在T1秒时,甲乙的距离。
ll y = (a2 - b2) * t2; // 在T2秒时,甲乙的距离。
if (x + y == 0) {
cout << "infinity" << endl; // 相加为0,就说明两人一直相遇。
return 0;
}
if ((x > 0 && x + y > 0) || (x < 0 && x + y < 0)) {
cout << "0" << endl; // 如果两人第一次,第二次距离越来越远。就输入0
return 0;
}
ll df = abs(x + y);
ll d1 = abs(x);
ll c = (d1 / df) * 2;
if (d1 % df != 0) c++; // 判断是否相遇
cout << c << endl;
return 0;
}