洛谷 P2571 [SCOI2010]传送带

2024-03-24 07:32

本文主要是介绍洛谷 P2571 [SCOI2010]传送带,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题:
题目描述

在一个 222 维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段 AB\text{AB}AB 和线段 CD\text{CD}CD。lxhgww 在 AB\text{AB}AB 上的移动速度为 PPP,在 CD\text{CD}CD 上的移动速度为 QQQ,在平面上的移动速度 RRR。现在 lxhgww 想从 A\text AA 点走到 D\text DD 点,他想知道最少需要走多长时间。
输入格式

第一行 444 个整数,表示 A\text AA 和 B\text BB 的坐标,分别为 AxA_xAx​,AyA_yAy​,BxB_xBx​,ByB_yBy​。

第二行 444 个整数,表示 C\text CC 和 D\text DD 的坐标,分别为 CxC_xCx​,CyC_yCy​,DxD_xDx​,DyD_yDy​。

第三行 333 个整数,分别是 PPP,QQQ,RRR。
输出格式

输出数据为一行,表示 lxhgww 从 A\text AA 点走到 D\text DD 点的最短时间,保留到小数点后 222 位。
输入输出样例
输入 #1

0 0 0 100

100 0 100 100

2 2 1

输出 #1

136.60

说明/提示

对于 100%100%100% 的数据,1≤Ax,Ay,Bx,By,Cx,Cy,Dx,Dy≤1031\le A_x,A_y,B_x,B_y,C_x,C_y,D_x,D_y\le10^31≤Ax​,Ay​,Bx​,By​,Cx​,Cy​,Dx​,Dy​≤103,1≤P,Q,R≤101\le P,Q,R\le101≤P,Q,R≤10。

代码:

#include<bits/stdc++.h>
using namespace std;
struct Point
{double x,y;
};const double eps=1e-6;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;double dist(double& ax, double& ay, double& bx, double& by)
{return sqrt((ax-bx)*(ax-bx) + (ay-by) * (ay-by));
}Point FD_solve(double& ex, double& ey, Point& c, Point& d)
{double lx = c.x, ly = c.y;double rx = d.x, ry = d.y;while(dist(lx, ly, rx, ry) > eps){double mid_x = (rx - lx) / 3;double mid_y = (ry - ly) / 3;double F_lx = lx + mid_x, F_rx = rx - mid_x;double F_ly = ly + mid_y, F_ry = ry - mid_y;double res_l = dist(ex, ey, F_lx, F_ly) / r + dist(F_lx, F_ly, d.x, d.y) / q;double res_r = dist(ex, ey, F_rx, F_ry) / r + dist(F_rx, F_ry, d.x, d.y) / q;if (res_r - res_l > eps){rx = F_rx;ry = F_ry;}else{lx = F_lx;ly = F_ly;}}Point F{lx, ly};return F;
}double AE_solve(Point& a, Point& b, Point& c, Point& d)
{double lx = a.x, ly = a.y;double rx = b.x, ry = b.y;while(dist(lx, ly, rx, ry) > eps){double mid_x = (rx-lx) / 3;double mid_y = (ry - ly) / 3;double E_lx = lx + mid_x, E_rx = rx - mid_x;double E_ly = ly + mid_y, E_ry = ry - mid_y;Point F_l = FD_solve(E_lx, E_ly, c, d);Point F_r = FD_solve(E_rx, E_ry, c, d);double res_l = dist(a.x, a.y, E_lx, E_ly) / p // AE+ dist(E_lx, E_ly, F_l.x, F_l.y) / r // EF+ dist(F_l.x, F_l.y, d.x, d.y) / q; // FDdouble res_r = dist(a.x, a.y, E_rx, E_ry) / p // AE+ dist(E_rx, E_ry, F_r.x, F_r.y) / r // EF+ dist(F_r.x, F_r.y, d.x, d.y) / q; // FDif (res_r - res_l > eps){rx = E_rx;ry = E_ry;}else{lx = E_lx;ly = E_ly;}}Point F = FD_solve(lx, ly, c, d);return dist(a.x, a.y, lx, ly) / p // AE+ dist(lx, ly, F.x, F.y) / r // EF+ dist(F.x, F.y, d.x, d.y) / q;
}int main()
{ios::sync_with_stdio(false);while(cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy>>p>>q>>r){Point A{ax,ay};Point B{bx, by};Point C{cx, cy};Point D{dx, dy};double ans = AE_solve(A,B,C,D);cout<<fixed<<setprecision(2)<<ans<<endl;}return 0;
}

解答:

设在传送带AB上走动的距离为AE,在传送带CD上走动的距离为FD,在其它空间上走动的距离,很显然是EF,那么列出函数方程发现是个二元函数,求偏导得到的结果是一个一次函数,说明在两个元上单峰,三分嵌套三分解决。每次三分E点,在根据E点三分F点得到结果即可。

(看评论区还有模拟退火的,建议别用,如果不能rush掉,调死你=_=)

这篇关于洛谷 P2571 [SCOI2010]传送带的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840872

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

洛谷刷题(7)

P8738 [蓝桥杯 2020 国 C] 天干地支 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。 地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、

基于yolov5的煤矿传送带异物检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的煤矿传送带异物检测系统是一种高效、智能的监测解决方案,专为煤矿等复杂工业环境设计。该系统利用YOLOv5深度学习算法,结合现场摄像头,对煤矿传送带上的异物进行实时监测与识别。 YOLOv5以其出色的检测速度和准确性著称,通过将原始图像划分为多个网格,并在每个网格中预测可能的目标边界框,实现对传送带上大块煤、矸石、锚杆、槽钢等异物的快速识别。系统能够自动区分正常物

C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码

马上就开学了,又一个卷季,不写点东西怎么行呢?辣么,我不准备写那些dalao们都懂得,熟练的,想来想去,最终还是写哈希表吧!提供讲解&题目&代码解析哦! 奉上题目链接: 洛谷题目 - 哈希,hash 1、哈希、哈希表(hash)简介 哈希(Hash)是一种将任意长度的输入映射为固定长度输出的算法。哈希函数的输出值称为哈希值或散列值。哈希函数具有以下特性: 确定性:对于相同的输入

洛谷p2236彩票题解

题目描述 某地发行一套彩票。彩票上写有 1 到 M 这 M 个自然数。彩民可以在这 M 个数中任意选取 N 个不同的数打圈。每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同。 每次抽奖将抽出两个自然数 X 和 Y。如果某人拿到的彩票上,所选 N 个自然数的倒数和,恰好等于 X/Y,则他将获得一个纪念品。 已知抽奖结果 X 和 Y。现在的问题是,必须准备多少纪念品,才能保证支付所有获奖者的

洛谷p2994题解 [USACO10OCT] Dinner Time S

题目描述 Farmer John's N (1 <= N <= 1,000) cows conveniently numbered 1..N are participating in the IOI in Bulgaria. The cows like the Bulgarian sun and are enjoying their holiday. All seems well. This