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,R
Output
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位。

显然是先从AB的某点E出发,然后经过平面到达CD的某点F,然后从F到达D。
我们假设已经确定了E,然后我们确定CD的F时,我们通过直觉感知到随着点F从C移动到D
时间关于位移的函数图像是一个先减少后增加的图形。
我们再来确定E,通过直觉,
时间关于位移的函数图像依然是一个先减少后增加的图形。
所以我们先三分E,再三分F,
我们用三分套三分解决了这个问题。

# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <math.h>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define MAXN 250005
# define eps 1e-3
# define MAXM 1000005
# define MOD 1000000007
# define INF 1000000000
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<1,l,mid
# define rch p<<1|1,mid+1,r
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
typedef unsigned long long ULL;
int _MAX(int a, int b){return a>b?a:b;}
int _MIN(int a, int b){return a>b?b:a;}
int Scan() {
    int res=0, flag=0;
    char ch;
    if((ch=getchar())==‘-‘) flag=1;
    else if(ch>=‘0‘&&ch<=‘9‘) res=ch-‘0‘;
    while((ch=getchar())>=‘0‘&&ch<=‘9‘)  res=res*10+(ch-‘0‘);
    return flag?-res:res;
}
void Out(int a) {
    if(a<0) {putchar(‘-‘); a=-a;}
    if(a>=10) Out(a/10);
    putchar(a%10+‘0‘);
}

double ax, ay, bx, by, cx, cy, dx, dy, p, q, r;

double dis(double x1, double y1, double x2, double y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
double cal(double x, double y)
{
    double ans=dis(ax,ay,x,y)/p;
    double lx=cx, ly=cy, rx=dx, ry=dy;
    while (dis(lx,ly,rx,ry)>eps) {
        double P1x=(lx+lx+rx)/3, P1y=(ly+ly+ry)/3, P2x=(lx+rx+rx)/3, P2y=(ly+ry+ry)/3;
        double t1=dis(P1x,P1y,dx,dy)/q+dis(x,y,P1x,P1y)/r, t2=dis(P2x,P2y,dx,dy)/q+dis(x,y,P2x,P2y)/r;
        if (t1<=t2) rx=P2x, ry=P2y;
        else lx=P1x, ly=P1y;
    }
    return ans+dis(lx,ly,dx,dy)/q+dis(x,y,lx,ly)/r;
}
int main ()
{
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
    double lx=ax, ly=ay, rx=bx, ry=by;
    while (dis(lx,ly,rx,ry)>eps) {
        double P1x=(lx+lx+rx)/3, P1y=(ly+ly+ry)/3, P2x=(lx+rx+rx)/3, P2y=(ly+ry+ry)/3;
        double t1=cal(P1x,P1y), t2=cal(P2x,P2y);
        if (t1<=t2) rx=P2x, ry=P2y;
        else lx=P1x, ly=P1y;
    }
    printf("%.2lf\n",cal(lx,ly));
    return 0;
}

时间: 2024-10-01 00:31:51

BZOJ 1857 传送带 (三分套三分)的相关文章

【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 输入

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