【BZOJ1857】传送带(三分)

题面

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

题解

又是一道很有意思的题目

现在相当于要求一个函数的最小值

自然要YY是一个下凸函数

然后就首先在AB线段上三分一个点出来算答案

答案怎么算了,那自然在CD线段上先找一个点,在计算吧。

继续YY这也是一个下凸函数

所以又来一次三分

然后就蜜汁的做完了。

但是,这题也很迷,三分的时候请使用do-while

否则会有奇怪的数据,因为点挨得很近

导致三分没有进行

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define esp 1e-5
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
double A1,B1,A2,B2,Lx,Rx,Ly,Ry;
double Ax,Ay,Bx,By,Cx,Cy,Dx,Dy;
double P,Q,RR;
double Dis(double x,double y,double X,double Y)
{
return sqrt((x-X)*(x-X)+(y-Y)*(y-Y));
}
double Count(double xx,double yy)
{
double lx=Cx,rx=Dx;
double ly=Cy,ry=Dy;
double ret=0;
do
{
double m1=(rx-lx)/3+lx,z1=(ry-ly)/3+ly;
double m2=lx+rx-m1,z2=ly+ry-z1;
double tt1=Dis(Ax,Ay,xx,yy)/P+Dis(xx,yy,m1,z1)/RR+Dis(m1,z1,Dx,Dy)/Q;
double tt2=Dis(Ax,Ay,xx,yy)/P+Dis(xx,yy,m2,z2)/RR+Dis(m2,z2,Dx,Dy)/Q;
if(tt1>tt2)lx=m1,ly=z1,ret=tt2;
else rx=m2,ry=z2,ret=tt1;
}while(fabs(lx-rx)>esp||fabs(ly-ry)>esp);
return ret;
}
int main()
{
Ax=read();Ay=read();Bx=read();By=read();
Cx=read();Cy=read();Dx=read();Dy=read();
P=read();Q=read();RR=read();
Lx=Ax,Rx=Bx;
Ly=Ay,Ry=By;
double ans=0;
do
{
double mx1=(Rx-Lx)/3+Lx,my1=(Ry-Ly)/3+Ly;
double mx2=Lx+Rx-mx1,my2=Ly+Ry-my1;
double k1=Count(mx1,my1),k2=Count(mx2,my2);
if(k1>k2)Lx=mx1,Ly=my1,ans=k1;
else Rx=mx2,Ry=my2,ans=k2;
}while(fabs(Rx-Lx)>esp||fabs(Ry-Ly)>esp);
printf("%.2lf\n",ans);
return 0;
}

【BZOJ1857】传送带(三分)的更多相关文章

  1. 【BZOJ1857】[Scoi2010]传送带 三分套三分

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

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

    1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 575[Submit][Status][ ...

  3. 【BZOJ1857】【SCOI2010】传送带 [三分]

    传送带 Time Limit: 1 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送 ...

  4. bzoj1857: [Scoi2010]传送带--三分套三分

    三分套三分模板 貌似只要是单峰函数就可以用三分求解 #include<stdio.h> #include<string.h> #include<algorithm> ...

  5. [BZOJ1857][SCOI2010]传送带-[三分]

    Description 传送门 Solution 三分套三分.代码简单但是证明苦兮兮.. 假如我们在AB上选了一个点G,求到该点到D的最小时间. 图中b与CD垂直.设目前从G到D所耗时间最短的路径为G ...

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

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

  7. bzoj 1857: [Scoi2010]传送带 三分

    题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 934  Solved: 501[Submit][Stat ...

  8. BZOJ1857 传送带 (三分法求单峰函数极值)

    第一次发BZOJ的题解,先从水题开始吧,好不容易找到一道水题,那就从这题开始吧. 1.题设部分{ 题目描述: 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线 ...

  9. 洛谷P2571 [SCOI2010]传送带 [三分]

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

  10. loj10017. 「一本通 1.2 练习 4」传送带(三分套三分)

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

随机推荐

  1. 在阿里云CentOS 7创建swap分区

    https://blog.tanteng.me/2016/03/aliyun-centos-7-swap/ Centos 系统swap虚拟内存添加与删除配置

  2. python学习:使用正则收集ip信息

        使用正则表达式收集主机信息        #!/usr/bin/env python   from subprocess import Popen, PIPE import re def ge ...

  3. .NET 设计模式的六大原则理论知识

    1. 单一职责原则(SRP)(Single Responsibility Principle)2. 里氏替换原则(LSP)(Liskov Substitution Principle)3. 依赖倒置原 ...

  4. 基于微软企业库的AOP组件(含源码)

    软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...

  5. Freemarker的基本语法及入门基础

    freemarker的基本语法及入门基础一.freemarker模板文件(*.ftl)的基本组成部分        1. 文本:直接输出的内容部分        2. 注释:不会输出的内容,格式为&l ...

  6. 巧用Dictionary<TKey,TValue>,完成客户需求

    前几天与客户沟通一个项目,客户对其中某个模块提了一个需求. 把从数据库中取出的对物品的统计重新拆分重新统计.鉴于用文字不能清除的表达需求,我将该需求画出来,便于理解. 需求如下图: 就是A,B,C D ...

  7. 去掉chrome浏览器中input获得焦点时的带颜色边框呢

    可以设置表单控件的outline属性为none值, 来去掉Chrome浏览器中输入框以及其它表单控件获得焦点时的带颜色边框. css代码如下: input{outline:none}

  8. UVA - 11636 Hello World! (贪心)

    思路:复制次数最少并且可以部分复制,那么贪心地让当前尽量多的复制,如果最后一次复制会超过n,那就部分复制.即满足并且x尽量小. AC代码 #include <stdio.h> const ...

  9. POJ - 3126 bfs + 素数筛法 [kuangbin带你飞]专题一

    题意:给定两个四位素数作为终点和起点,每次可以改变起点数的某一位,且改变后的数仍然是素数,问是否可能变换成终点数字? 思路:bfs搜索,每次改变四位数中的某一位.素数打表方便判断新生成的数是否是素数. ...

  10. 理解 Git

    Git 如何保存文件 其它版本管理系统通常会保存所有文件及其历次提交的差异(diff / revision),通过 merge 原始文件与各阶段的差异就能获取任何版本的状态 而 Git 保存的是每一次 ...