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>
using namespace std;
#define Eps 1e-3
struct Node{
    double x,y;
    Node(){}
    Node(double x,double y):x(x),y(y){}
    Node operator + (Node a){return Node(x+a.x,y+a.y);}
    Node operator - (Node a){return Node(x-a.x,y-a.y);}
    Node operator / (double a){return Node(x/a,y/a);}
    inline void Read(){scanf("%lf%lf",&x,&y);}
}a,b,c,d,l,r,m1,m2;
int i,j,k,n,m,p,v1,v2,v3;
inline double Dis(Node a,Node b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline double Get(Node a,Node b,Node c,Node d){
    return Dis(a,b)/v1+Dis(b,c)/v3+Dis(c,d)/v2;
}
inline double Calc(Node x){
    Node l=c,r=d,m1,m2;
    while(Dis(l,r)>Eps){
        m1=(r-l)/3;m2=r-m1;m1=l+m1;
        if(Get(a,x,m1,d)>Get(a,x,m2,d))l=m1;else r=m2;
    }
    return Get(a,x,l,d);
}
int main(){
    a.Read();b.Read();c.Read();d.Read();
    scanf("%d%d%d",&v1,&v2,&v3);
    l=a;r=b;
    while(Dis(l,r)>Eps){
        m1=(r-l)/3;m2=r-m1;m1=l+m1;
        if(Calc(m1)>Calc(m2))l=m1;else r=m2;
    }
    printf("%.2lf\n",Calc(l));
    return 0;
}

bzoj1857

时间: 2024-08-02 15:42:14

bzoj1857 [ SCOI2010 ] -- 三分套三分的相关文章

【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),那

三分套三分 --- 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 传送带 (三分套三分)

在一个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点的最短时间,保留

#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

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