NC20276 [SCOI2010]传送带
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]传送带的更多相关文章
- bzoj 1857: [Scoi2010]传送带 三分
题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 934 Solved: 501[Submit][Stat ...
- P2571 [SCOI2010]传送带
P2571 [SCOI2010]传送带 三分套三分. 前提条件:P3382 [模板]三分法 三分,求区间内单峰函数的最大/最小值. 我们把两条线段都跑三分,先ab后cd,求出最小值. 可以直接将二维坐 ...
- 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
- [SCOI2010]传送带 三分法
[SCOI2010]传送带 LG传送门 三分法模板. 关于为什么可以三分,我选择感性理解,有人证明了,总之我是懒得证了. 假设路径是\(A \to E \to F \to D\),\(E\)和\(F\ ...
- 【BZOJ1857】[Scoi2010]传送带 三分套三分
[BZOJ1857][Scoi2010]传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度 ...
- BZOJ1857 Scoi2010 传送带 【三分】
BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...
- 【解题报告】洛谷 P2571 [SCOI2010]传送带
[解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...
- Bzoj 1857: [Scoi2010]传送带(三分套三分)
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
- BZOJ 1857: [Scoi2010]传送带
二次联通门 : BZOJ 1857: [Scoi2010]传送带 /* BZOJ 1857: [Scoi2010]传送带 三分套三分 可能是吧..dalao们都说明显是一个单峰函数 可是我证不出来.. ...
随机推荐
- 2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空)
2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空) https://www.luogu.com.cn/problem/P2328 题意: 输出n位B进制的格雷码. 分析: ...
- 保姆级教程:VsCode调试docker中的NodeJS程序
最近在写NodeJS相关的项目,运行在docker容器中,也是想研究一下断点调试,于是查阅相关资料,最终顺利配置好了. 首先我选择了VsCode作为ide,并用VsCode来做NodeJS可视化deb ...
- ChCore Lab1 机器启动 实验笔记
本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第一篇. 书籍官网:现代操作系统:原理与实现,里面有实验的参考指南和代码仓 ...
- ShardingSphere 集成 CosId 实战
背景 在软件系统演进过程中,随着业务规模的增长 (TPS/存储容量),我们需要通过集群化部署来分摊计算.存储压力. 应用服务的无状态设计使其具备了伸缩性.在使用 Kubernetes 部署时我们只需要 ...
- Android添加背景图片和设置app图标
Android添加背景图片和设置app图标 Android 添加背景图片 第一步:找到你要当做背景的图片,并下载下来 第二步:将图片复制到app->res->mipmap文件夹下 第三步: ...
- kNN-准备数据
在上一小节,我们大概了解了kNN算法的基本原理,现在我们要进行数据的处理 本小节所用数据集来自[机器学习实战]:Machine Learning in Action (manning.com) 下载数 ...
- WinUI迁移到即将"过时"的.NET MAUI个人体验
迁移的初衷 本人平时是做.net相关的工作,对于.net技术栈也有一些了解,自从新的.net能够跨平台之后,之前也有跨平台的ui框架Xamarin,现在微软推出了.NET MAUI这个说是 统一了开发 ...
- 【freertos】008-内存管理
前言 本章主要讲解内部存储空间(RAM)的管理. 详细分析heap5方案. 参考: 李柱明博客 https://freertos.blog.csdn.net/article/details/51606 ...
- python之名称空间与函数对象
目录 名称空间 内置名称空间 全局名称空间 局部名称空间 名称的查找顺序 作用域 global关键字 nonlocal关键字 函数名的多种用法 函数的嵌套 名称空间 名称空间就是变量名与变量值绑定关系 ...
- 一些基本的jar包
jackson与前端传送数据 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti ...