BZOJ 1857 [Scoi2010]传送带 三分套三分

2024-03-30 16:38

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

Description

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

Input

输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R

Output

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

Sample Input

0 0 0 100
100 0 100 100
2 2 1


Sample Output

136.60

HINT

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
















传送门
简单yy证明一下,从A到D的路程一定是AB上一段,平面内一段,CD上一段的。
也就是说不存在“折返”的情况。
那么假设AB上从A连续走到了(x1,y1),然后在CD上走到(x2,y2)后走到了D,
写一下距离的表达式,把距离分成3段(省去开根):
(Ax,Ay)~(x1,y1):(x1-Ax)^2+(y1-Ay)^2
(x1,y1)~(x2,y2):(x1-x2)^2+(y1-y2)^2
(x2,y2)~(Dx,Dy):(x2-Dx)^2+(y2-Dy)^2
时间就是距离除以上面的速度了,因为是常量,就不表示了。
假设我们枚举一下AB上的那个点(x1,y1),那么未知量就是(x2,y2)了,
其它量都看做已知量,我们得到了一个二元式f(x,y)=ax^2+by^2+cx+dy+e
由于是在一条线段上的(woc一开始没看见死活不会……)
所以实际上y和x有一个一次关系,这个二元式实际上是一个二次函数……
也就是说……单峰!
发现x^2前面的系数是正的,所以是下凸的,,那么(x2,y2)就可以简单地三分出来了。

但是直接枚举(x1,y1)似乎太慢了,于是就去猜想是不是也可以三分。
事实上和上面那个是类似的……
可以考虑固定一个最优的(x2,y2)来看。

所以就是三分(x1,y1),同时三分(x2,y2)了,所谓“三分套三分”
只要注意是个下凸的函数就好了其它也没什么。。





#include<bits/stdc++.h>
using namespace std;
const doubleeps=1e-4;
double P,Q,R,Ax,Ay,Bx,By,Cx,Cy,Dx,Dy;
double dis(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double Work_CD(double x,double y){double Lx=Cx,Ly=Cy,Rx=Dx,Ry=Dy;while (fabs(Lx-Rx)>eps || fabs(Ly-Ry)>eps){double lxmid=Lx+(Rx-Lx)/3.0,lymid=Ly+(Ry-Ly)/3.0,rxmid=Lx+(Rx-Lx)/3.0*2.0,rymid=Ly+(Ry-Ly)/3.0*2.0;if (dis(x,y,lxmid,lymid)/R+dis(Dx,Dy,lxmid,lymid)/Q>dis(x,y,rxmid,rymid)/R+dis(Dx,Dy,rxmid,rymid)/Q)Lx=lxmid,Ly=lymid;elseRx=rxmid,Ry=rymid;}return dis(x,y,Lx,Ly)/R+dis(Dx,Dy,Lx,Ly)/Q;
}
double Work_AB(){double Lx=Ax,Ly=Ay,Rx=Bx,Ry=By;while (fabs(Lx-Rx)>eps || fabs(Ly-Ry)>eps){double lxmid=Lx+(Rx-Lx)/3.0,lymid=Ly+(Ry-Ly)/3.0,rxmid=Lx+(Rx-Lx)/3.0*2.0,rymid=Ly+(Ry-Ly)/3.0*2.0;if (dis(Ax,Ay,lxmid,lymid)/P+Work_CD(lxmid,lymid)>dis(Ax,Ay,rxmid,rymid)/P+Work_CD(rxmid,rymid))Lx=lxmid,Ly=lymid;elseRx=rxmid,Ry=rymid;}return dis(Ax,Ay,Lx,Ly)/P+Work_CD(Lx,Ly);
}
int main(){scanf("%lf%lf%lf%lf",&Ax,&Ay,&Bx,&By);scanf("%lf%lf%lf%lf",&Cx,&Cy,&Dx,&Dy);scanf("%lf%lf%lf",&P,&Q,&R);printf("%.2lf\n",Work_AB());return 0;
}


这篇关于BZOJ 1857 [Scoi2010]传送带 三分套三分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

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

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

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

#1142 : 三分·三分求极值 ( 三分极值 )

#1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: [week40_1.PNG] 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。 提示:三分法 输入 第1行:5个整数a,b,c,x,

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

洛谷 P2569 [SCOI2010] 股票交易

题目来源于:洛谷 题目本质:动态规划,单调队列 解题思路: 方程f[i][j]表示第 i 天结束后,手里剩下 j 股的最大利润,则不买不卖:f[i][j]=f[i-1][j]。 买入:f[i][j]=max{f[i-w-1][k]+k*ap[i]}-ap[i]*j 卖出:f[i][j]=max{f[i-w-1][k]+k*bp[i]}-bp[i]*j 完整代码如下: #inclu

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in

BZOJ 2152 聪聪可可 (树上点分治)

题目地址:BZOJ 2152 找有多少对权值和为3的倍数的点。最简单的点分治。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#incl