NC20276 [SCOI2010]传送带

题目

题目描述

在一个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 100
100 0 100 100
2 2 1

输出

136.60

备注

对于 \(100\%\) 的数据,\(1\le A_x,A_y,B_x,B_y,C_x,C_y,D_x,D_y\le10^3\) 。

题解

思路

知识点:三分,计算几何。

关于时间计算有两个变量,一个是在 \(AB\) 上的终点 \(E\),一个是 \(CD\) 上的起点 \(F\) ,则总时长为 \(\frac{|AE|}{P} + \frac{|EF|}{R} + \frac{|FD|}{Q}\) 。

先固定 \(E\) ,计算固定 \(E\) 后最短时间,此时总时间关于 \(F\) 是单谷函数,所以可以三分 \(F\) 确定在 \(E\) 固定的情况下时间最短的 \(F\) ,然后就能得到某个 \(E\) 处的最短时间。而若对于每个 \(E\) 都取最短时间作为总a时间,则总时间关于 \(E\) 的函数也是一个单谷函数,所以可以三分 \(E\) ,求出使得总时间最短的点 \(E\) 。于是一个二重三分就能解决问题,里面的确定 \(F\) 得到每个 \(E\) 的最短时间,外面的确定求出使得总时间最短的点 \(E\) 。

实际上,总时长关于 \(E\) 和 \(F\) 的多元函数只有一个最小值,而对每个 \(E\) 都取最小值得到的总时长关于 \(E\) 的函数是一定过最小点的曲线,因此对 \(E\) 三分就能得到最小值。

细节上用参数方程来实现在直线上三分,用两点距离作为误差判断条件。

坑点:速度和右端点变量名重了,会炸qwq。

时间复杂度 \(O(1)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>

using namespace std;

const double esp = 1e-3;

struct Point {
double x, y;
}A, B, C, D;
double P, Q, R;//!R 和 r不要搞混了,被坑死了 double dist(Point a, Point b) {
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
} Point Fx1(double t) {
return { (B.x - A.x) * t + A.x,(B.y - A.y) * t + A.y };
} Point Fx2(double t) {
return { (D.x - C.x) * t + C.x,(D.y - C.y) * t + C.y };
} double calc(Point E) {
double ans = dist(A, E) / P;
double l = 0, r = 1;
while (dist(Fx2(l), Fx2(r)) >= esp) {
double mid1 = l + (r - l) / 3;
double mid2 = r - (r - l) / 3;
Point F1 = Fx2(mid1);
Point F2 = Fx2(mid2);
if (dist(E, F1) / R + dist(F1, D) / Q >= dist(E, F2) / R + dist(F2, D) / Q) l = mid1;
else r = mid2;
}
Point F = Fx2(l);
ans += dist(E, F) / R + dist(F, D) / Q;
return ans;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> A.x >> A.y >> B.x >> B.y;
cin >> C.x >> C.y >> D.x >> D.y;
cin >> P >> Q >> R; double l = 0, r = 1;
while (dist(Fx1(l), Fx1(r)) >= esp) {
double mid1 = l + (r - l) / 3;
double mid2 = r - (r - l) / 3;
Point E1 = Fx1(mid1);
Point E2 = Fx1(mid2);
if (calc(E1) >= calc(E2)) l = mid1;
else r = mid2;
}
Point E = Fx1(l);
cout << fixed << setprecision(2) << calc(E) << '\n';
return 0;
}

NC20276 [SCOI2010]传送带的更多相关文章

  1. bzoj 1857: [Scoi2010]传送带 三分

    题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 934  Solved: 501[Submit][Stat ...

  2. P2571 [SCOI2010]传送带

    P2571 [SCOI2010]传送带 三分套三分. 前提条件:P3382 [模板]三分法 三分,求区间内单峰函数的最大/最小值. 我们把两条线段都跑三分,先ab后cd,求出最小值. 可以直接将二维坐 ...

  3. 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)

    1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...

  4. [SCOI2010]传送带 三分法

    [SCOI2010]传送带 LG传送门 三分法模板. 关于为什么可以三分,我选择感性理解,有人证明了,总之我是懒得证了. 假设路径是\(A \to E \to F \to D\),\(E\)和\(F\ ...

  5. 【BZOJ1857】[Scoi2010]传送带 三分套三分

    [BZOJ1857][Scoi2010]传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度 ...

  6. BZOJ1857 Scoi2010 传送带 【三分】

    BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...

  7. 【解题报告】洛谷 P2571 [SCOI2010]传送带

    [解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...

  8. Bzoj 1857: [Scoi2010]传送带(三分套三分)

    1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...

  9. BZOJ 1857: [Scoi2010]传送带

    二次联通门 : BZOJ 1857: [Scoi2010]传送带 /* BZOJ 1857: [Scoi2010]传送带 三分套三分 可能是吧..dalao们都说明显是一个单峰函数 可是我证不出来.. ...

随机推荐

  1. petite-vue源码剖析-逐行解读@vue-reactivity之effect

    当我们通过effect将副函数向响应上下文注册后,副作用函数内访问响应式对象时即会自动收集依赖,并在相应的响应式属性发生变化后,自动触发副作用函数的执行. // ./effect.ts export ...

  2. oracle split 以及 简单json解析存储过程

    BEGIN; 由于之前工作上需要在oracle中做split功能以及json格分解.然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下: 1.包定义: CREATE O ...

  3. [原创][开源]C# Winform DPI自适应方案,SunnyUI三步搞定

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  4. 5.文件共享总结中篇-Linux服务器文件共享

    今天我们来讨论Linux系统之间的文件共享,包含:SCP.FTP.rz / sz.wget 一.SCP 其实我在写SSH协议常见问题排错章节中已介绍其SCP用法. 现我把SCP常用语法格式,给大家说下 ...

  5. 深度长文:深入理解Ceph存储架构

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 本文是一篇Ceph存储架构技术文章,内容深入到每个存储特 ...

  6. 原创工具14Finger-全能web指纹识别与分享平台

    14Finger 功能齐全的Web指纹扫描和分享平台,基于vue3+django前后端分离的web架构,并集成了长亭出品的rad爬虫的功能,内置了一万多条互联网开源的指纹信息. Github:http ...

  7. git 撤销远程 commit

    参考: https://blog.csdn.net/xs20691718/article/details/51901161 https://www.cnblogs.com/lfxiao/p/93787 ...

  8. SpringBoot从Eclipse添加的Tomcat容器中启动

    SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ...

  9. 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等

    温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...

  10. 微信小程序避坑指南——input框里的图标在部分安卓机里无法点击的问题

    问题场景: 下图中的显隐密码和验证码均为包裹在 input标签 中的 image标签, 但在开发测试中发现点击不了这俩个image标签,因为是被input标签的padding挡住了. 解决方法:将im ...