传送带

Time Limit: 1 Sec  Memory Limit: 64 MB
[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

Main idea

  给定平面上的两条线段AB,CD,在AB,CD上移动会有一个特别的速度,在平面上移动会有一个速度,求从点A到点D的最短时间。

Solution

  首先发现坐标范围-1000~1000,并且精度要求不高,从此基础上思考。我们先考虑从AB上一个定点O到CD上的距离,发现其中从O到CD的距离是先减小再增大的,我们大胆猜测这道题的答案满足单峰性。然后我们可以用三分(效率为O(log1.5(n)))来实现。
  我们现在可以求出一个定点求CD的最短时间,这里用三分实现。然后怎么办呢?
  由于AB也是一条线段,我们大胆猜测,可以再在AB上三分一个点,这样就是三分套三分,最后发现其正确性可以证明。
  三分方法(这里给出求最小值的方法):在区间1/3处和2/3处各取两个点l,r,如果左段(即L~l)的答案比右段(r~R)的更优,那么由于单峰性(图像类似一个抛物线)可以抹去右段,多次操作使得答案最优。

Code

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<queue>
 8 using namespace std;
 9
10 const int ONE=1005;
11 const int MOD=19650827;
12
13 int n;
14
15 struct power
16 {
17         double x,y;
18         double AB,CD,PM;
19         friend power operator +(power a,power b) {a.x=a.x+b.x; a.y=a.y+b.y; return a;}
20         friend power operator -(power a,power b) {a.x=a.x-b.x; a.y=a.y-b.y; return a;}
21
22 };
23 power A,B,C,D,v;
24 power l1,l2,r1,r2;
25 power a,b;
26 power pass;
27
28 int get()
29 {
30         int res,Q=1;    char c;
31         while( (c=getchar())<48 || c>57)
32         if(c=='-')Q=-1;
33         if(Q) res=c-48;
34         while((c=getchar())>=48 && c<=57)
35         res=res*10+c-48;
36         return res*Q;
37 }
38
39 double dist(power a,power b)
40 {
41         return (double)sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
42 }
43
44 double Getdist(power E,power F)
45 {
46         return dist(A,E)/v.AB + dist(E,F)/v.PM + dist(F,D)/v.CD;
47 }
48
49 double Trivide(power O)
50 {
51         power l=C,r=D,pass,a,b;
52         while(dist(l,r)>0.001)
53         {
54             pass.x=(r.x-l.x)/3.0;    pass.y=(r.y-l.y)/3.0;
55             a=l+pass;    b=r-pass;
56             if(Getdist(O,a) < Getdist(O,b)) r=b;
57             else l=a;
58         }
59         return Getdist(O,l);
60 }
61
62 int main()
63 {
64         scanf("%lf %lf %lf %lf",&A.x,&A.y,&B.x,&B.y);
65         scanf("%lf %lf %lf %lf",&C.x,&C.y,&D.x,&D.y);
66         scanf("%lf %lf %lf",&v.AB,&v.CD,&v.PM);
67
68         power l=A,r=B;
69         while(dist(l,r)>0.001)
70         {
71             pass.x=(r.x-l.x)/3.0;    pass.y=(r.y-l.y)/3.0;
72             a=l+pass;    b=r-pass;
73             if(Trivide(a) < Trivide(b)) r=b;
74             else l=a;
75         }
76
77         printf("%.2lf",Trivide(l));
78 }

View Code

转载于:https://www.cnblogs.com/BearChild/p/6441257.html

【BZOJ1857】【SCOI2010】传送带 [三分]相关推荐

  1. BZOJ1857 Scoi2010 传送带 【三分】

    BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...

  2. [BZOJ1857][Scoi2010]传送带

    1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1786  Solved: 981 [Submit][Status ...

  3. bzoj1857 [Scoi2010]传送带

    1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1635  Solved: 909 [Submit][Status ...

  4. P2571 [SCOI2010]传送带

    P2571 [SCOI2010]传送带 题意: 你要从 A 点到 D 点.有两条传送带:第一条从 A 到 B,速度为 pp,第二条从 C 到 D,速度为 q.不走传送带时速度为 r.求从 A 到 D ...

  5. BZOJ1857:[SCOI2010]传送带——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1857 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送 ...

  6. #10017 「一本通 1.2 练习 4」传送带+三分套三分

    题目描述 原题来自:SCOI 2010 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段  AB和线段CD .lxhgww 在  AB上的移动速度为 P ,在  ...

  7. [SCOI2010]传送带

    在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从 ...

  8. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  9. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

最新文章

  1. Mac MySQL 数据库配置(关系型数据库管理系统)
  2. 盘一盘2021全球流量最高的网站~
  3. 【嵌入式】C语言高级编程-语句表达式(03)
  4. varnish缓存服务器构建疑问
  5. linux两个卷组可以合并,Linux系统中所有的逻辑卷必须属于同一个卷组()。
  6. 宝塔apache mysql_宝塔Linux面板命令大全,安装宝塔,Nginx,Apache,MySQL等 - SEO中文网...
  7. node Koa框架+nunjucks模版开发简易的后台
  8. LINUX下载编译vorbis
  9. 【Windows版】CMake安装教程
  10. 力士乐伺服电机编码器调零_伺服电机编码器安装拆卸方法
  11. 分库分表面试题及答案
  12. C++汽车4S店管理系统
  13. 证件照蓝底变白底的方法
  14. 28BYJ-48 电机驱动(Linux)
  15. pandas算加权平均值_python – groupby加权平均值和pandas数据帧中的和
  16. Paper pusher 摆弄文件的人
  17. ndk开发教程,Android工程师面试该怎么准备?真香!
  18. html阅读模式怎么进入word模式,Word视图阅读模式 带您体验Word2013进入阅读模式、视图设置功能...
  19. 如何在企微客户端调试
  20. 【题库】上海学校心理咨询-普通心理学-考点解析 5.3 遗忘

热门文章

  1. mysql 3种报错_MySQL读取Binlog日志常见的3种错误-阿里云开发者社区
  2. Integer注意_享元设计模式
  3. Jenkins入门指南
  4. leetcode 滑动窗口小结 (一)
  5. Python-杨辉三角
  6. array_column php什么版本可以用,array_column兼容php5.5以下版本
  7. int 转interger java_Java中Integer和int之间的转换
  8. 独立看门狗---STM32----HAL
  9. php中的__FUNCTION__
  10. 判断一个数字是否存在于某一个数据之中