【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),那么也容易理解,离F点越近的点越优,也就是一个单峰函数啦,可以三分。

那么再考虑E点,反过来说AB上必定存在一个E使得解最优(不然题目要算什么),那么离这个点越近也越优,同样是单峰,还是三分。

对于AB上三分得到的两点E1和E2,都有各自在CD上对应的最优点F,此时算出各自的最优解进行比较,所用时间分别为t1,t2,若t1>t2,说明E2离最优解更近,lx=x1,ly=y1;反之则rx=x2,ry=y2。

接着就是三分套三分啦,实现起来不难,具体细节看代码。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define eps 1e-3
using namespace std;
struct point
{
    int x,y;
}a,b,c,d;
int p,q,r;
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double cal(double x,double y)
{
    double lx=c.x,ly=c.y,rx=d.x,ry=d.y;
    double x1,y1,x2,y2,t1,t2;
    double ab=dis(x,y,a.x,a.y)/p;
    while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
    {
        x1=lx+(rx-lx)/3;y1=ly+(ry-ly)/3;
        x2=lx+(rx-lx)/3*2;y2=ly+(ry-ly)/3*2;
        t1=ab+dis(x1,y1,x,y)/r+dis(d.x,d.y,x1,y1)/q;
        t2=ab+dis(x2,y2,x,y)/r+dis(d.x,d.y,x2,y2)/q;
        if(t1>t2)lx=x1,ly=y1;
        else rx=x2,ry=y2;
    }
    return ab+dis(lx,ly,x,y)/r+dis(d.x,d.y,lx,ly)/q;
}
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;
}
int main()
{
    a.x=read();a.y=read();b.x=read();b.y=read();
    c.x=read();c.y=read();d.x=read();d.y=read();
    p=read();q=read();r=read();
    double lx=a.x,ly=a.y,rx=b.x,ry=b.y;
    double x1,y1,x2,y2,t1,t2;
    while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
    {
        x1=lx+(rx-lx)/3;y1=ly+(ry-ly)/3;
        x2=lx+(rx-lx)/3*2;y2=ly+(ry-ly)/3*2;
        t1=cal(x1,y1);t2=cal(x2,y2);
        if(t1>t2)lx=x1,ly=y1;
        else rx=x2,ry=y2;
    }
    printf("%.2lf",cal(lx,ly));
    return 0;
}

时间: 2024-12-25 14:49:01

【bzoj1857】传送带——三分套三分的相关文章

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

1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 575[Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input 输入

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 [ 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

#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 ******

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 并计算距离. 实现 实现小结

HDU3400 三分套三分

题意 就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑, 在其他地方跑速度是r.问你从A到D最少的时间. 三分AB ,然后再三分CD ,模板题目,这题卡精度 eps不能少 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include <set> 7