Uva 11796:

甲和乙两条狗分别沿着一条折线奔跑。两只狗的速度位置,但已知他们同时出发,同时到达,并且都是匀速奔跑。你的任务是求出甲和乙在奔跑过程中的最远距离和最近距离之差。

分析:这里分析两只狗在运动过程的距离问题,我们这里面临如下两个困难:

(1)    两只狗都在动。

(2)    狗的运动路线是折线。

为了解决第一个问题,我们这里考虑物理当中的运动相对性,我们假设两只狗当前走得都是直线(简化模型),我们将一直狗视为静止,做其运动方向所在向量的相反向量,将其和另一只狗的运动向量进行合成,那么合成后的向量路径其实就能够准确的表示两只狗的相对位置,那么我们求解比较困难的两个动点间距离的最大值最小值的问题就转化成了顶点到确定线段距离的最大值或者最小值。

而针对第二个问题,我们只需要在模拟计算的过程中,将整个运动过程一一划分成上文所给出的“简化模型”即可。

那么现在我们要在代码层面进行更为详细的讨论:

如何求解一个顶点到一条线段的最短距离(最长距离)呢?

最长距离很好理解,一定是这个顶点到线段的两个端点连线的其中一个,这个就不必赘言,这里我们主要分析一下最短距离。

首先我们要将几何中所有的情况罗列出来,这样对应着我们才能够进行代码实现。

下面基于图形我们进行简单的代数运算。

需要注意的几点是,这里的情况其实包含了P在A、B上的情况。从微积分的教材上,向量的叉乘得到的是向量,但是这里我们进行叉乘运算得到的是数字,因此上式叉乘外边的“||”符号是绝对值的意思。

简单的参考代码如下(未提交):

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
const double eps=1e-10;using namespace std;struct Point
{double x;double y;Point(double x=0,double y=0):x(x),y(y){}void operator<<(Point &A) {cout<<A.x<<' '<<A.y<<endl;}
};int dcmp(double x)  {return (x>eps)-(x<-eps); }typedef  Point  Vector;Vector  operator +(Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y);}Vector  operator -(Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }Vector  operator *(Vector A,double p) { return Vector(A.x*p,A.y*p);  }Vector  operator /(Vector A,double p) {return Vector(A.x/p,A.y/p);}// ps  cout

ostream &operator<<(ostream & out,Point & P) { out<<P.x<<' '<<P.y<<endl; return out;}bool  operator< (const Point &A,const Point &B) { return A.x<B.x||(A.x==B.x&&A.y<B.y); }bool  operator== ( const Point &A,const Point &B) { return dcmp(A.x-B.x)==0&&dcmp(A.y-B.y)==0;}double  Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}double  Cross(Vector A,Vector B)  {return A.x*B.y-B.x*A.y; }double  Length(Vector A)  { return sqrt(Dot(A, A));}double DistanceToSegment(Point P , Point A , Point B)
{if(A == B)  return Length(P-A);Vector v1 = B-A ;Vector v2 = P-A ;Vector v3 = P-B ;if(dcmp(Dot(v1,v2)) < 0)  return Length(v2);else if(dcmp(Dot(v1,v3)) > 0) return Length(v3);else return fabs(Cross(v1 , v2))/Length(v1);
}Point  read_point()
{Point P;scanf("%lf%lf",&P.x,&P.y);return  P;
}double Max,Min;const int maxn=60;Point P[maxn],Q[maxn];void update(Point P,Point A,Point B)
{Min=min(Min,DistanceToSegment(P, A,B));Max=max(Max,Length(P-A));Max=max(Max,Length(P-B));}int main()
{int T;int A,B;cin>>T;for(int kase = 1;kase <= T;kase++){cin>>A>>B;for(int i=0;i<A;i++)  P[i]=read_point();for(int i=0;i<B;i++)  Q[i]=read_point();double LenA=0,LenB=0;for(int i=0;i<A-1;i++)  LenA+=Length(P[i+1]-P[i]);for(int i=0;i<B-1;i++)  LenB+=Length(Q[i+1]-Q[i]);int Sa=0,Sb=0;Min= 1e9;Max=-1e9;Point Pa=P[0];Point Pb=Q[0];while(Sa<A-1 && Sb < B-1){double  La=Length(P[Sa+1]-Pa);double  Lb=Length(Q[Sb+1]-Pb);double T=min(La/LenA,Lb/LenB);Vector Va=(P[Sa+1]-Pa)/La*T*LenA;Vector Vb=(Q[Sb+1]-Pb)/Lb*T*LenB;update(Pa,Pb,Pb+Vb-Va);Pa=Pa+Va;Pb=Pb+Vb;if(Pa==P[Sa+1])  Sa++;if(Pb==Q[Sb+1])  Sb++;}printf("Case %d: %.0lf\n",kase,Max -Min);}}

转载于:https://www.cnblogs.com/rhythmic/p/5743156.html

《训练指南》——8.5相关推荐

  1. 训练指南第一部分解题报告

    主要是提供训练指南第一部分解题报告链接,后面会持续更新中 307 - Sticks  (DFS+剪枝) 11292 - Dragon of Loowater (贪心) 11729 - Commando ...

  2. 训练指南第二章-基础问题

    训练指南第二章-基础问题 P170 2 / 4 Problem A UVA 10943 How do you add? 1 / 2 Problem B UVA 10780 Again Prime? N ...

  3. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  4. 算法竞赛训练指南代码仓库_数据仓库综合指南

    算法竞赛训练指南代码仓库 重点 (Top highlight) As a data scientist, it's valuable to have some idea of fundamental ...

  5. 训练指南——数学专题一的总结

    差不多一个星期过去了,在这一个多星期里,我做了一个数学专题和两场训练赛,要说对自己的感觉,只能说很差劲,开始的时候以为环境会比现在宽松很多,后来才发现想法是错误的,实验室室里室一种紧张的气氛,感觉就像 ...

  6. 《算法竞赛入门经典训练指南》pdf

    下载地址:网盘下载 基本介绍 编辑 内容简介 <算法竞赛入门经典:训练指南>题目多选自近年来ACM/ICPC区域赛和总决赛真题,内容全面,信息量大,覆盖了常见算法竞赛中的大多数细分知识点. ...

  7. 一根绳子从一头烧需30时分钟_小学生一分钟跳绳满分训练指南

    小学生一分钟跳绳测试项目是体育老师和众多家庭的痛,大多数的孩子1分钟跳不到60个.而跳绳又是体质健康测试里占分比较高的一个项目,所以很多宝妈/宝爸们很是焦虑.因此,我们根据平时儿童跳绳训练的经验和网上 ...

  8. 算法竞赛入门经典训练指南

    最近在看算法竞赛入门经典训练指南这本书,书中不错的算法我将在博客中发布,和大家共同学习. 题目: 在你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个 ...

  9. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  10. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

最新文章

  1. little w and Soda(思维题)
  2. gulp将多张小图自动合成雪碧图
  3. Json字符串解析原理、超大json对象的解析
  4. C语言程序设计第三次作业——选择结构(1)
  5. Hadoop权威指南:HDFS-目录,查询文件系统,删除文件
  6. 聊聊WebClient的LoadBalance支持
  7. 解决 Android ping IPv6 地址显示 network is unreachable 的问题
  8. 频域补零上采样_AURIX 学习笔记(12)频域法互相关实现超声测距
  9. 嵌入式 linux 启动脚本 编写,[9构建嵌入式linux系统项目-启动脚本的编写.ppt
  10. jQuery 的上传图片预览插件
  11. JAVA标准输出错误输出,从tsls输出中提取标准错误
  12. windows qt 使用openssl API
  13. Android Studio实现 历史上的今天
  14. HQL左外连接及排序
  15. VSCode 花式玩法(摸鱼)了解一下
  16. Ardunio开发:esp32—cam摄像头
  17. vue 在线编辑excel表格(原生和使用组件的两种方式)
  18. easyswoole入门
  19. Android软键盘的全面解析,让你不再怕控件被遮盖
  20. 【katacontainer基础知识】kata-container介绍与原理

热门文章

  1. VS code 使用 Remote-SSH 进行python远程开发
  2. spotlight soo5072:there was an error reading the tnsnames.ora
  3. exp/expdp中query参数的使用
  4. i5 11300H和i5 10300H 的区别
  5. Linux漏洞CVE整理
  6. docker版wordpress
  7. 一个支持Abort的BackgroundWorker
  8. 前端的date类型后台接收_腾讯高级前端工程师支招,云开发实现小程序打赏和提现云开发实践...
  9. 2017长春java平均工资_长春2017社保平均工资,2017年长春平均工资计算方法
  10. 每日程序C语言45-连接两个链表