校赛 折返跑

小明和小红在 100 m 100m 100m 跑道上练习折返跑,小明以 a a a 米每秒的速度匀速跑步,小红以 b b b 米每秒的速度匀速跑步,小明跑得比小红快(即 a > b a>b a>b )。假设他们同时出发,问小红跑一个来回的时间内,小明和小红相遇了几次。

注意起点处不算相遇,若两人在结束时同时到达终点处则算相遇(具体可参见样例)。
输入格式
第一行一个整数 T T T ( 1 ≤ T ≤ 10 1≤T≤10 1T10) ,代表数据组数。

下面 T T T 行每行两个整数 a , b a,b a,b ( 1 ≤ a ≤ b ≤ 100 1≤a≤b≤100 1ab100) 分别表示小明和小红的速度。

#include 
using namespace std;

int T;
double vMing, vHong;
struct line {
	double k, b, begin, end;
};

int cnt;

bool cross(line l1, line l2, double left, double right)//(left,right]
{
	if (l1.k == l2.k)
	{
		return false;
	}

	double crossX = ((l2.b - l1.b) / (l1.k - l2.k));
	if (crossX > left&&crossX <= right && l1.k*crossX + l1.b >= 0)
	{
		return true;
	}
	return false;
}


int main()
{
	cin >> T;
	while (T--)
	{
		cnt = 0;
		cin >> vMing >> vHong;

		double TMing = 100 / vMing;
		double THong = 100 / vHong;
		int i = 1;
		while ((i - 1)*TMing <= 2 * THong)
		{
			line l1;
			if (i & 2)
			{
				l1.k = vMing;
				l1.b = -100 * i + 100;
				l1.begin = (i - 1)*TMing;
				l1.end = i * TMing;
			}
			else
			{
				l1.k = -vMing;
				l1.b = 100 * i;
				l1.begin = (i - 1)*TMing;
				l1.end = i * TMing;
			}
			line l2;
			if ((i - 1)*TMing <= THong)
			{
				l2.k = vHong;
				l2.b = 0;
			}
			else
			{
				l2.k = -vHong;
				l2.b = 200;
			}
			cnt += cross(l1, l2, l1.begin, l1.end);
			i++;
		}
		cout << cnt << endl;
	}
}
计算几何

你可能感兴趣的:(计算几何)