博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 11796 Dog Distance
阅读量:4319 次
发布时间:2019-06-06

本文共 3451 字,大约阅读时间需要 11 分钟。

题意:

有甲乙两条狗分别沿着一条折线奔跑,已知它们同时从各自的起点出发,同时到达各自的终点。求整个过程中两条狗的最大距离Max与最小距离Min的差值。

分析:

假设甲乙的路线都是一条线段的简单情况。运动是相对的,我们假定甲不动,乙相对甲的运动也是匀速直线运动。所以就将问题转化成了点到直线的最小和最大距离。

甲或乙每到达一个拐点所对应的时刻称作“关键点”,那么没两个关键点之间的运动都可看做上面分析的简单情况。我们只要及时更新甲乙的位置即可。

LenA和LenB分别是两条路线的总长,因为运动时间相同,不妨设二者的运动速度为LenA和LenB,这样总时间为1

 

1 //#define LOCAL 2 #include 
3 #include
4 #include
5 #include
6 using namespace std; 7 8 struct Point 9 {10 double x, y;11 Point(double x=0, double y=0) :x(x),y(y) {}12 };13 typedef Point Vector;14 Point read_point(void)15 {16 double x, y;17 scanf("%lf%lf", &x, &y);18 return Point(x, y);19 }20 const double EPS = 1e-8;21 Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }22 Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }23 Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }24 Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }25 bool operator < (const Point& a, const Point& b)26 { return a.x < b.x || (a.x == b.x && a.y < b.y); }27 int dcmp(double x)28 { if(fabs(x) < EPS) return 0; else return x < 0 ? -1 : 1; }29 bool operator == (const Point& a, const Point& b)30 { return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0; }31 double Dot(Vector A, Vector B)32 { return A.x*B.x + A.y*B.y; }33 double Length(Vector A) { return sqrt(Dot(A, A)); }34 35 double Cross(Vector A, Vector B)36 { return A.x*B.y - A.y*B.x; }37 double DistanceToSegment(Point P, Point A, Point B)38 {39 if(A == B) return Length(P - A);40 Vector v1 = B - A, v2 = P - A, v3 = P - B;41 if(dcmp(Dot(v1, v2)) < 0) return Length(v2);42 else if(dcmp(Dot(v1, v3)) > 0) return Length(v3);43 else return fabs(Cross(v1, v2)) / Length(v1);44 }45 const int maxn = 60;46 Point P[maxn], Q[maxn];47 double Min, Max;48 49 void update(Point P, Point A, Point B)50 {51 Min = min(Min, DistanceToSegment(P, A, B));52 Max = max(Max, Length(P-A));53 Max = max(Max, Length(P-B));54 }55 56 int main(void)57 {58 #ifdef LOCAL59 freopen("11796in.txt", "r", stdin);60 #endif61 62 int T, A, B;63 scanf("%d", &T);64 for(int kase = 1; kase <= T; ++kase)65 {66 int A, B;67 scanf("%d%d", &A, &B);68 for(int i = 0; i < A; ++i) P[i] = read_point();69 for(int i = 0; i < B; ++i) Q[i] = read_point();70 71 double LenA = 0.0, LenB = 0.0;72 for(int i = 0; i < A-1; ++i) LenA += Length(P[i+1] - P[i]);73 for(int i = 0; i < B-1; ++i) LenB += Length(Q[i+1] - Q[i]);74 75 int Sa = 0, Sb = 0; //甲乙当前端点的编号76 Point Pa = P[0], Pb = Q[0];77 Min = 1e9, Max = -1e9;78 while(Sa < A-1 && Sb < B-1)79 {80 double La = Length(P[Sa+1] - Pa); //甲乙分别到下一拐点的距离81 double Lb = Length(Q[Sb+1] - Pb);82 double T = min(La / LenA, Lb / LenB);83 Vector Va = (P[Sa+1] - Pa) / La * T * LenA;84 Vector Vb = (Q[Sb+1] - Pb) / Lb * T * LenB;85 update(Pa, Pb, Pb + Vb - Va);86 Pa = Pa + Va;87 Pb = Pb + Vb;88 if(Pa == P[Sa+1]) Sa++;89 if(Pb == Q[Sb+1]) Sb++;90 }91 92 printf("Case %d: %.0lf\n", kase, Max - Min);93 }94 return 0;95 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4023078.html

你可能感兴趣的文章
java动态代理
查看>>
Selector的2种样式
查看>>
Mac 卸载mysql
查看>>
php-fpm用socket连接
查看>>
.net core跨域传递cookie
查看>>
SpringMVC <mvc:view-controller path=""/>标签
查看>>
adobe flash player升级coredump分析
查看>>
pycharm快捷键、经常使用设置、配置管理
查看>>
element-ui table 最后一行合计,单元格合并
查看>>
.NET 常用加密、解密& 数字签名算法
查看>>
开博声明
查看>>
FileReader读取文件
查看>>
逆向-攻防世界-re2-cpp-is-awesome
查看>>
Oracle分割字符串 REGEXP_SUBSTR用法
查看>>
O/R Mapping实际开发经验之谈(转)
查看>>
今天才知道原来我还没弄清楚js中全局变量和局部变量的定义...
查看>>
用户心理特征
查看>>
【z05】聪明的质检员
查看>>
【5001】n皇后问题
查看>>
【codeforces 796D】Police Stations
查看>>