[洛谷P3843] TJOI2007 迷路

时间:2020-07-11
本文章向大家介绍[洛谷P3843] TJOI2007 迷路,主要包括[洛谷P3843] TJOI2007 迷路使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目背景

小 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\n",ans);
	return 0;
}

原文地址:https://www.cnblogs.com/LSlzf/p/13285662.html