• [洛谷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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    26种激发人创造力的天使商标设计
    TopFreeTheme精选免费模板【20130703】
    解决插入到MySql数据库中乱码问题
    商务名片创意搜罗
    10个优质PSD文件资源下载
    TopFreeTheme精选免费模板【20130701.特别版】
    【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明
    谨慎使用keySet:对于HashMap的2种遍历方式比较
    有关google的guava工具包详细说明
    java消除 list重复值及交集,并集,差集
  • 原文地址:https://www.cnblogs.com/LSlzf/p/13285662.html
Copyright © 2020-2023  润新知