题链:

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

题解:

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

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

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 60
using namespace std;
const double eps=1e-8;
struct Point{
double x,y;
Point(double _x=0,double _y=0):x(_x),y(_y){}
void Read(){scanf("%lf%lf",&x,&y);}
};
int sign(double x){
if(fabs(x)<=eps) return 0;
return x<0?-1:1;
}
typedef Point Vector;
bool operator == (Point A,Point B){return sign(A.x-B.x)==0&&sign(A.y-B.y)==0;}
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Point A,Point 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);}
double operator ^ (Vector A,Vector B){return A.x*B.y-A.y*B.x;}
double operator * (Vector A,Vector B){return A.x*B.x+A.y*B.y;}
Vector Va,Vb;
Point Da[MAXN],Db[MAXN],Pa,Pb;
int T,Na,Nb,ia,ib;
double minans,maxans,La,Lb,Lena,Lenb,tim;
double GL(Vector A){//Get_Length
return sqrt(A*A);
}
double DTS(Point P,Point a1,Point a2){//Distance_To_Segment
static Vector v1,v2,v3;
v1=a2-a1; v2=P-a1; v3=P-a2;
if(a1==a2) return GL(v2);
if(sign(v1*v2)<0) return GL(v2);
if(sign(v1*v3)>0) return GL(v3);
return fabs(v2^v3)/GL(v1);
}
void contribution(Point P,Point a1,Point a2){
minans=min(minans,DTS(P,a1,a2));
maxans=max(maxans,GL(P-a1));
maxans=max(maxans,GL(P-a2));
}
int main(){
freopen("/home/noilinux/Documents/模块学习/计算几何/11796.in","r",stdin);
scanf("%d",&T);
for(int t=1;t<=T;t++){
scanf("%d%d",&Na,&Nb);
for(int i=1;i<=Na;i++) Da[i].Read();
for(int i=1;i<=Nb;i++) Db[i].Read();
Lena=Lenb=0; minans=1e9; maxans=-1e9;
for(int i=1;i<Na;i++) Lena+=GL(Da[i+1]-Da[i]);
for(int i=1;i<Nb;i++) Lenb+=GL(Db[i+1]-Db[i]);
ia=1,ib=1; Pa=Da[1],Pb=Db[1];
while(ia<Na&&ib<Nb){
La=GL(Da[ia+1]-Pa);
Lb=GL(Db[ib+1]-Pb);
tim=min(La/Lena,Lb/Lenb);
Va=(Da[ia+1]-Pa)/La*tim*Lena;
Vb=(Db[ib+1]-Pb)/Lb*tim*Lenb;
contribution(Pa,Pb,Pb+Vb-Va);
Pa=Pa+Va; Pb=Pb+Vb;
if(Pa==Da[ia+1]) ia++;
if(Pb==Db[ib+1]) ib++;
}
printf("Case %d: %.0lf\n",t,maxans-minans);
}
return 0;
}

  

●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. 201621123050 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  2. vue内置指令详解——小白速会

    指令 (Directives) 是带有 v- 前缀的特殊属性,职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM. 内置指令 1.v-bind:响应并更新DOM特性:例如:v-bi ...

  3. stringify 字符串转化成json方法

    参照原文:http://www.cnblogs.com/damonlan/ http://www.jb51.net/article/29893.htm stringify的作用主要是序列化对象(转化为 ...

  4. Echarts柱状图实现不同颜色渐变色

    第一次写文,只是想记录一下自己平时发现的小功能,这篇主要是实现echarts柱状图,每个柱子实现不同颜色的渐变色,也是第一次接触echarts,后台使用ssm,前台是extjs,直接上效果图 直接上j ...

  5. ThinkPad安装deepin操作系统报错解决方法

    目前deepin操作系统,软件也比较多,所以想在自己的thinkpad t430笔记本上安装.但是安装时报错,具体错误忘了看了.反复试了好几次都不行,最后在网上查了,讲bios设置调整之后可以正常安装 ...

  6. APP手机端加载不到资源服务器后台解决参考

    今天发现app登录时,报could not get resource,日志中打印的是redis相关的错误,于是开始一步步检查错误! 后台架构:redis+mysql+elk+tomcat+zookee ...

  7. Python扩展模块——selenium的使用(定位、下载文件等)

    想全面的使用selenium可以下载<selenium 2自动化测试实战-基于Python语言>PDF的电子书看看 我使用到了简单的浏览器操作,下载文件等功能... 推荐使用firefox ...

  8. 剑指offer-删除链表中重复的节点

    题目描述   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...

  9. ( 转 ) CORS 有一次 OPTIONS 请求的原理

    刚接触前端的时候,以为HTTP的Request Method只有GET与POST两种,后来才了解到,原来还有HEAD.PUT.DELETE.OPTIONS-- 目前的工作中,HEAD.PUT.DELE ...

  10. mosquitto验证client互相踢

    cleint11A订阅topic#################################################### server发送topic消息 ############### ...