【BZOJ-1857】传送带 三分套三分

1857: [Scoi2010]传送带

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 1077  Solved: 575
[Submit][Status][Discuss]

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

Source

Day2

Solution

三分法,用于求单峰函数的极值问题,思路很好想

给定左右端点L,R;找出两个三等分点M1,M2(L<=M1<=M2<=R),如果M1比M2更优,则L=M1,否则R=M2

这道题,首先,关系很好找,发现是单峰函数,那么三分找最值即可

不过这里的话用到三分套三分,也非常好理解

对于外层三分出的M1,M2,如果比较大小,需要内部再进行三分来确定,这就是三分套三分

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
#define eps 1e-3
int Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,P,Q,R;
double dist(double x1,double y1,double x2,double y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
double Calc(double X,double Y)
{
    double Lx=Cx,Ly=Cy,Rx=Dx,Ry=Dy;
    while (fabs(Rx-Lx)>eps || fabs(Ry-Ly)>eps)
        {
            double Mx1=Lx+(Rx-Lx)/3,My1=Ly+(Ry-Ly)/3,Mx2=Lx+(Rx-Lx)/3*2,My2=Ly+(Ry-Ly)/3*2;
            double LL=dist(Ax,Ay,X,Y)/P+dist(X,Y,Mx1,My1)/R+dist(Mx1,My1,Dx,Dy)/Q;
            double RR=dist(Ax,Ay,X,Y)/P+dist(X,Y,Mx2,My2)/R+dist(Mx2,My2,Dx,Dy)/Q;
            if (LL>RR) Lx=Mx1,Ly=My1;
                else Rx=Mx2,Ry=My2;
        }
    return dist(Ax,Ay,X,Y)/P+dist(X,Y,Lx,Ly)/R+dist(Lx,Ly,Dx,Dy)/Q;
}
int main()
{
    Ax=read(); Ay=read(); Bx=read(); By=read();
    Cx=read(); Cy=read(); Dx=read(); Dy=read();
    P=read(); Q=read(); R=read();
    double Lx=Ax,Ly=Ay,Rx=Bx,Ry=By;
    while (fabs(Rx-Lx)>eps || fabs(Ry-Ly)>eps)
        {
            double Mx1=Lx+(Rx-Lx)/3,Mx2=Lx+(Rx-Lx)/3*2,My1=Ly+(Ry-Ly)/3,My2=Ly+(Ry-Ly)/3*2;
            double LL=Calc(Mx1,My1),RR=Calc(Mx2,My2);
            if (LL>RR) Lx=Mx1,Ly=My1;
                else Rx=Mx2,Ry=My2;
        }
    printf("%.2lf\n",Calc(Lx,Ly));
    return 0;
}

我会说因为变量重名WA了3发吗....A Sad Story...

时间: 2024-10-14 12:07:04

【BZOJ-1857】传送带 三分套三分的相关文章

BZOJ 1857 传送带 (三分套三分)

在一个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,ROutput输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留

【bzoj1857】传送带——三分套三分

我的第一道三分题目. 早上跟着cyc学了一下三分,晚上想练一下手发现没什么水题就找到了这一道2333 主要是证明是一个单峰函数,这也是本题最难的部分(网上好多人写出来但不会证明:)) 证明过程来自yyl dalao: 本题要讨论必使r<max(q,p),否则还要走什么传送带... 从A点出发,要使解最优,必定要走A->E->F->D,其中E是AB上一点,F为CD上一点. 因为E和F都是不确定的,我们不妨假设E点已经确定,那么CD上必定存在一点F使得EF和FD最优(先不考虑AE),那

#10017 传送带(SCOI 2010)(三分套三分)

[题目描述] 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段 AB 和线段 CD.lxhgww 在 AB上的移动速度为 P ,在 CD 上的移动速度为 Q,在平面上的移动速度 R.现在 lxhgww 想从 A 点走到 D 点,他想知道最少需要走多长时间. [题目链接] https://loj.ac/problem/10017 [算法] 猜想两条线段的最优点均满足单峰性质,于是三分套三分,代码借鉴黄学长.(http://hzwer.com/4255.html

三分套三分 --- HDU 3400 Line belt

Line belt Problem's Link:    Mean: 给出两条平行的线段AB, CD,然后一个人在线段AB的A点出发,走向D点,其中,人在线段AB上的速度为P, 在线段CD上的速度为Q,在其他地方的速度为R,求人从A点到D点的最短时间. analyse: 经典的三分套三分. 首先在AB线段上三分,确定一个点,然后再在CD上三分,确定第二个点,计算出answer.也就是嵌套的三分搜索. Time complexity: O(logn*logm) Source code:  // M

hdu3400(三分套三分)

题意:平面上两条线段 AB,CD. A到B的速度v1,C到D的速度v2,其他地方的速度V3.求A到D的最短时间. 解法:三分嵌套三分,首先如果AB上的点确定后,确定CD的点的确定应该是符合三分性质的,应该是单调或最多凸型分布的.那么确定AB上的点,也应该不会出现多个峰谷吧.没有严格证明,是知道有个这个三分嵌套三分的题目才来做的. 代码: /****************************************************** * author:xiefubao ******

BZOJ 1857 传送带

三分套三分. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define eps 1e-4 using namespace std; double x,y,v1,v2,v0; struct point { double x,y; point (double x,double y):x(x),y(y) {} poi

bzoj1857 [ SCOI2010 ] -- 三分套三分

显然我们一定是先走到AB上一点X,然后走到CD上一点Y,最后到D. 那么答案就是|AX|/P+|XY|/R+|YD|/Q 假设我们已经确定了X,那么目标就是在CD上找一点Y,使|XY|/R+|YD|/Q最小. 显然这是个单峰函数. 那么三分套三分就可以了. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> us

D.Country Meow 最小球覆盖 三分套三分套三分 &amp;&amp; 模拟退火

// 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值. ? 思路 非常裸的最小球覆盖问题啊,即找到半径最小的球包含全部的点. 在最小圆覆盖问题上,可以使用随机增量法,这里没有四点确定球心的公式,所以板子失效了. 最小圆覆盖可以用三分套三分,这里空间有三维,假装证明得到在任意一维上都满足凸函数特性,那么再套一层维度三分就OK了. ? AC代码 三分套三分套三分写法,复杂度O(n

[THOJ 1589] 椭球面 三分套三分

题意 现在给出一个椭球面: $ax ^ 2 + by ^ 2 + cz ^ 2 + dyz + exz + fxy = 1$ . 求椭球面到 $(0, 0, 0)$ 的距离. $T \le 200, 0 < a, b, c < 1, 0 \le d, e, f < 1$ . 假装 $(0, 0, 0)$ 在椭球内部. 分析 二次的式子通常都是单峰的. 猜测椭球到 $(0, 0, 0)$ 的距离也是单峰的. 三分 x , 三分 y , 利用一元二次方程解出 z 并计算距离. 实现 实现小结