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
备注
对于 的数据, 。
题解
知识点:三分,计算几何。
关于时间计算有两个变量,一个是在 上的终点 ,一个是 上的起点 ,则总时长为 。
先固定 ,计算固定 后最短时间,此时总时间关于 是单谷函数,所以可以三分 确定在 固定的情况下时间最短的 ,然后就能得到某个 处的最短时间。而若对于每个 都取最短时间作为总a时间,则总时间关于 的函数也是一个单谷函数,所以可以三分 ,求出使得总时间最短的点 。于是一个二重三分就能解决问题,里面的确定 得到每个 的最短时间,外面的确定求出使得总时间最短的点 。
实际上,总时长关于 和 的多元函数只有一个最小值,而对每个 都取最小值得到的总时长关于 的函数是一定过最小点的曲线,因此对 三分就能得到最小值。
细节上用参数方程来实现在直线上三分,用两点距离作为误差判断条件。
坑点:速度和右端点变量名重了,会炸qwq。
时间复杂度
空间复杂度
代码
#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; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16421862.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧