题链:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2896

题解:

计算几何,骚操作
对于简单情况,即两只狗的路线均为一条线段,
可以从相对运动的角度出发,考虑一直狗不动,另一只狗在运动。
而由于两只狗此时都在做匀速直线运动,所以在那只不懂的狗看来,另一直狗也在匀速直线前行。(物理老师:速度的矢量和!)
所以这个简单情况下,问题就变为了求一个点到一条线段的最短和最长距离。

而本题中虽然路线为多条折线,但仍然可以根据拐点把路线拆为一个个的简单情况,进而即可求解。

代码:

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #define MAXN 60
  6. using namespace std;
  7. const double eps=1e-8;
  8. struct Point{
  9. double x,y;
  10. Point(double _x=0,double _y=0):x(_x),y(_y){}
  11. void Read(){scanf("%lf%lf",&x,&y);}
  12. };
  13. int sign(double x){
  14. if(fabs(x)<=eps) return 0;
  15. return x<0?-1:1;
  16. }
  17. typedef Point Vector;
  18. bool operator == (Point A,Point B){return sign(A.x-B.x)==0&&sign(A.y-B.y)==0;}
  19. Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
  20. Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
  21. Vector operator * (Vector A,double p){return Vector(A.x*p,A.y*p);}
  22. Vector operator / (Vector A,double p){return Vector(A.x/p,A.y/p);}
  23. double operator ^ (Vector A,Vector B){return A.x*B.y-A.y*B.x;}
  24. double operator * (Vector A,Vector B){return A.x*B.x+A.y*B.y;}
  25. Vector Va,Vb;
  26. Point Da[MAXN],Db[MAXN],Pa,Pb;
  27. int T,Na,Nb,ia,ib;
  28. double minans,maxans,La,Lb,Lena,Lenb,tim;
  29. double GL(Vector A){//Get_Length
  30. return sqrt(A*A);
  31. }
  32. double DTS(Point P,Point a1,Point a2){//Distance_To_Segment
  33. static Vector v1,v2,v3;
  34. v1=a2-a1; v2=P-a1; v3=P-a2;
  35. if(a1==a2) return GL(v2);
  36. if(sign(v1*v2)<0) return GL(v2);
  37. if(sign(v1*v3)>0) return GL(v3);
  38. return fabs(v2^v3)/GL(v1);
  39. }
  40. void contribution(Point P,Point a1,Point a2){
  41. minans=min(minans,DTS(P,a1,a2));
  42. maxans=max(maxans,GL(P-a1));
  43. maxans=max(maxans,GL(P-a2));
  44. }
  45. int main(){
  46. freopen("/home/noilinux/Documents/模块学习/计算几何/11796.in","r",stdin);
  47. scanf("%d",&T);
  48. for(int t=1;t<=T;t++){
  49. scanf("%d%d",&Na,&Nb);
  50. for(int i=1;i<=Na;i++) Da[i].Read();
  51. for(int i=1;i<=Nb;i++) Db[i].Read();
  52. Lena=Lenb=0; minans=1e9; maxans=-1e9;
  53. for(int i=1;i<Na;i++) Lena+=GL(Da[i+1]-Da[i]);
  54. for(int i=1;i<Nb;i++) Lenb+=GL(Db[i+1]-Db[i]);
  55. ia=1,ib=1; Pa=Da[1],Pb=Db[1];
  56. while(ia<Na&&ib<Nb){
  57. La=GL(Da[ia+1]-Pa);
  58. Lb=GL(Db[ib+1]-Pb);
  59. tim=min(La/Lena,Lb/Lenb);
  60. Va=(Da[ia+1]-Pa)/La*tim*Lena;
  61. Vb=(Db[ib+1]-Pb)/Lb*tim*Lenb;
  62. contribution(Pa,Pb,Pb+Vb-Va);
  63. Pa=Pa+Va; Pb=Pb+Vb;
  64. if(Pa==Da[ia+1]) ia++;
  65. if(Pb==Db[ib+1]) ib++;
  66. }
  67. printf("Case %d: %.0lf\n",t,maxans-minans);
  68. }
  69. return 0;
  70. }

  

●UVA 11796 Dog Distance的更多相关文章

  1. UVA 11796 Dog Distance(几何)

    Dog Distance [题目链接]Dog Distance [题目类型]几何 &题解: 蓝书的题,刘汝佳的代码,学习一下 &代码: // UVa11796 Dog Distance ...

  2. UVA 11796 - Dog Distance 向量的应用

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. 简单几何(相对运动距离最值) UVA 11796 Dog Distance

    题目传送门 题意:两只狗在折线上跑,速度未知,同时出发,同时达到.问跑的过程中,两狗的最大距离和最小距离的差 分析:训练指南P261,考虑相对运动,设A静止不动,B相对A运动,相对的运动向量:Vb - ...

  4. UVA 11796 - Dog Distance

    题意  两条狗啊,同时跑,,同时结束,各自跑各自的道路,问跑的过程中,他们最大距离和最小距离的差: 方法  恶心一点就是,最大最小距离的求解方法,假设两只狗都只有一条线段要跑,则可以判定在端点处有最大 ...

  5. UVA 11796 Dog Distance(向量)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=31962 [代码] #include<cstdio> # ...

  6. UVa 11796 计算几何

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. UVA 10140 - Prime Distance(数论)

    10140 - Prime Distance 题目链接 题意:求[l,r]区间内近期和最远的素数对. 思路:素数打表,打到sqrt(Max)就可以,然后利用大的表去筛素数.因为[l, r]最多100W ...

  8. UVA 11796

    题意:  有两个狗, 按照 多边形跑,不知道两条狗的速度,但是狗是同时出发,同时到达终点的 输出两条狗的 最大相距距离 - 最小相距距离: 思路 : 用物理的相对运动来计算, 每次只计算 两条狗的直线 ...

  9. UVA11796 Dog Distance

    题意 PDF 分析 问题可以转化为小问题,即两条狗分别在线段上运动. 然后用相对运动知识可以认为甲不动,乙在线段上运动. 小问题就转化为点到线段的最小或最大距离. 时间复杂度\(O(I \times ...

随机推荐

  1. 201621123057 《Java程序设计》第1周学习总结

    1.本周学习总结 .java - - 源程序 .class - - 字节码文件 JVM - - 虚拟机 JRE - - 执行环境 JDK - - 开发工具包 其中,运行的是.class,而非.java ...

  2. java实现同步的两种方式

    同步是多线程中的重要概念.同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果.同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字. 给一个方法 ...

  3. Beta冲刺Day3

    项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ...

  4. java 二维码解析和生成

    package ykxw.web.qrcode.utils; import java.awt.Color; import java.awt.Graphics2D; import java.awt.im ...

  5. vue style width a href动态拼接问题 ?

    style width 这个问题 折磨了我一个上午了  好惭愧 因为项目涉及到 进度条 所以必须用行内样式  style 用过vue的都知道 vue中style的用法 大众用法 :style=&quo ...

  6. mongodb监控工具mongostat

    mongostat的使用及命令详解 mongostat是mongodb自带的状态检测工具,在命令行下使用,会间隔固定时间获取mongodb的当前运行状态,并输出. 1.常用命令格式: mongosta ...

  7. 完美解决ubuntu Desktop 16.04 中文版firefox在非root用户不能正常启动的问题

    ubuntu安装好后,默认安装有firefox浏览器,不过,非root的账户登录,双击firefox图标,居然出现如下提示:Your Firefox profile cannot be loaded. ...

  8. c 语言的基本语法

    1,c的令牌(Tokens) printf("Hello, World! \n"); 这五个令牌是: printf ( "Hello, World! \n" ) ...

  9. TortoiseGit安装与使用

    公司的源码是在码云上,平时进行项目源码管理和团队开发都会使用到GIT,花了一天时间才将Git搞明白,这是一个工具,我在这里就简单说一下,其安装使用方法,也是对自己学习的总结;本文章适合于刚接触GIT的 ...

  10. UVA850【简单模拟】

    题目:解密句子.有一些被加密的句子已知一条模板翻译,判断是否可以解密,可以的话将所有句子解密. #include <stdio.h> #include<iostream> #i ...