博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2571 [SCOI2010]传送带
阅读量:5200 次
发布时间:2019-06-13

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

链接:https://www.luogu.org/problemnew/show/P2571

题目描述

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间

输入输出格式

输入格式:

 

输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By

第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy

第三行是3个整数,分别是P,Q,R

 

输出格式:

 

输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位

 

输入输出样例

输入样例#1: 
0 0 0 100100 0 100 1002 2 1
输出样例#1: 
136.60

说明

对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000

1<=P,Q,R<=10 题解:

三分套。

• 首先如果确定了 AB 上从哪个点离开,那么 上从哪个点离开,那么 上从哪个点离开,那么 CD 上点的 上点的 距离函数一定是个单谷,可以三分来求。 
• 如何求解 AB 上的点呢?
• 他也满足单谷的性质,可以三分来求。用CD上的点来更新AB上的点

#include
using namespace std;const double eps = 1e-6;double Ax, Ay, Bx, By, Cx, Cy, Dx, Dy, p, q, r;double dis(double x1, double y1, double x2, double y2){ return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));}double work(double nx, double ny){ double lf = Cx, rg = Dx, hlf = Cy, hrg = Dy, ans = 1000000008; while(1){ double midx = (lf + rg) / 2, midy = (hlf + hrg) / 2; double midxm = (midx + rg) / 2, midym = (midy + hrg) / 2; double tmp1 = dis(nx, ny, midx, midy)/r + dis(Ax, Ay, nx, ny)/ p + dis(midx, midy, Dx, Dy)/q; double tmp2 = dis(nx, ny, midxm, midym)/r + dis(Ax, Ay, nx, ny)/ p + dis(midxm, midym, Dx, Dy)/q; if(tmp1 < tmp2) rg = midxm, hrg = midym; else lf = midx, hlf = midy; ans = min(ans, min(tmp1, tmp2)); // printf("%lf %lf\n", tmp1, tmp2); if(fabs(midx-midxm) < eps && fabs(midy-midym) < eps)break; } return ans; }int main(){ double ans = 100000000008; scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &Ax, &Ay, &Bx, &By, &Cx, &Cy, &Dx, &Dy, &p, &q, &r); double lf = Ax, rg = Bx, hlf = Ay, hrg = By; while(1){ double midx = (lf + rg) / 2, midy = (hlf + hrg) / 2; double midxm = (midx + rg) / 2, midym = (midy + hrg) / 2; double ans1 = work(midx, midy), ans2 = work(midxm, midym); if(ans1 < ans2) rg = midxm, hrg = midym; else lf = midx, hlf = midy; ans = min(ans, min(ans1, ans2)); if(fabs(midx-midxm) < eps && fabs(midy-midym) < eps)break; } printf("%.2lf\n", ans);}
View Code

 

转载于:https://www.cnblogs.com/EdSheeran/p/9277885.html

你可能感兴趣的文章
[Luogu P3119] [USACO15JAN]草鉴定Grass Cownoisseur (缩点+图上DP)
查看>>
【原创】大数据基础之Zookeeper(4)应用场景
查看>>
18款在线代码片段测试工具
查看>>
20.C++- &&,||逻辑重载操作符的缺陷、,逗号重载操作符的分析
查看>>
静态变量数组实现LRU算法
查看>>
在SQL中怎么把一列字符串拆分为多列
查看>>
中文系统 上传file的input显示英文
查看>>
css样式写一个三角形
查看>>
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
javascript获取textarea中所选文本的开始位置、结束位置和选择的文本
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
JSch - Java实现的SFTP(文件上传详解篇)
查看>>
一些注意点
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
C#修饰符
查看>>
20.核心初始化之异常向量表
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>