题目背景
小 A 和小 B 在一个二维空间中迷路了,每个人在这个空间中都按照自己特定的路线行
走,由于他们的路线都是周期性的,因此你可以把这种路线理解为一种“轨道”:即一条封
闭的路线,路线的终点和起点重合,这样才能“周期”的行走。
问题描述
两个人行走的速度都是每秒一个单位距离,而且他们的路线都是平行于坐标轴的。基于
此,如果两个人无限的走下去,我们想知道他们每一秒相离最近的距离。(我们只考虑两人
在每秒行走后相离的距离,不考虑他们在这 1 秒内某个时刻的距离)
输入格式
输入文件中有两个相似的部分,分别描述小 A 和小 B 的行走轨道。在每一个部分中的
第一行有三个整数,sx、sy 和 m,前两个整数表示其初始位置,第三个整数表示轨道中折线
的数目,以下 m 行,每行有一个整数 d 和一个非空格字符 c,d 和 c 之间用一个空格隔开。
d 表示小 A 或小 B 沿坐标的正方向行走的距离,而 c 为’X’或’Y’,表示是 X 坐标轴还是 Y
坐标轴。输入数据保证在每一个部分中,我们从起点(sx, sy)开始,执行 m 次行走步骤后,一定能
回到起点,即这个轨道是封闭的。
输出格式
输出文件中只包含一个实数,精确到小数点后两位。表示能观测到的两个人的最近距离,
如果可能在某个时间两个人到达同一个点,则输出 0.00。
样例输入
0 0 4
-1 Y
-1 X
1 Y
1 X
1 0 4
-1 X
1 Y
1 X
-1 Y
样例输出
1.00
数据范围
100%的数据中,对于任何 m 和 d,有 1 ≤ m, d ≤ 100,轨道的初始坐标的绝对值不超
过 2 000。
解析
模拟题,直接走最大公倍数次即可。14分应该是看错题目了。
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#define N 102
#define M 10002
using namespace std;
struct event{
int d;
char c;
}a[N],b[N];
int n,xa,ya,ma,da,xb,yb,mb,db,i,j=1,k=1;
double ans;
int gcd(int a,int b)
{
if(a%b) return gcd(b,a%b);
return b;
}
double dis(int x1,int y1,int x2,int y2)
{
return sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
cin>>xa>>ya>>ma;
for(i=1;i<=ma;i++) cin>>a[i].d>>a[i].c,da+=abs(a[i].d);
cin>>xb>>yb>>mb;
for(i=1;i<=mb;i++) cin>>b[i].d>>b[i].c,db+=abs(b[i].d);
n=da*db/gcd(da,db);
ans=dis(xa,ya,xb,yb);
int la=a[1].d,lb=b[1].d;
for(i=1;i<=n;i++){
if(la==0) j=j%ma+1,la=a[j].d;
if(lb==0) k=k%mb+1,lb=b[k].d;
if(a[j].c=='X'){
if(la>0) xa++,la--;
else xa--,la++;
}
else{
if(la>0) ya++,la--;
else ya--,la++;
}
if(b[k].c=='X'){
if(lb>0) xb++,lb--;
else xb--,lb++;
}
else{
if(lb>0) yb++,lb--;
else yb--,lb++;
}
ans=min(ans,dis(xa,ya,xb,yb));
}
printf("%.2lf
",ans);
return 0;
}