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

时间:2023-12-01 23:13:26

  题目传送门

传送带

题目描述

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间

输入输出格式

输入格式:

输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By

第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy

第三行是3个整数,分别是P,Q,R

输出格式:

输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位

输入输出样例

输入样例#1:
0 0 0 100
100 0 100 100
2 2 1
输出样例#1:
136.60

说明

对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000,1<=P,Q,R<=10


  分析:

  如果会三分算法的话,这题就很显然了。但是考的时候蒟蒻并没有学,于是弃疗,然后输出了样例,结果最后代码忘了蒯上去,然后呵呵。

  思路很简单,先三分线段AB上的点,在三分线段CD上的点,然后求出移动时间,就这么进行。就这样,三分套三分(难道这就是传说中的九分???(并不是))STO%%%神佬太巨了,竟然想到用向量水分。。。STO%%%five20太巨了可以用模拟退火A掉。。。

  Code:

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-;
int n;
double l,r,ans,a[];
double fun(double x)
{
double ret=a[];
for(int i=;i<=n;i++)
ret=ret*x+a[i+];
return ret;
}
int main()
{
scanf("%d%lf%lf",&n,&l,&r);
for(int i=;i<=n+;i++)
scanf("%lf",&a[i]);
while(){
double mid=(l+r)/;
double remid=(mid+r)/;
double ans1=fun(mid);
double ans2=fun(remid);
if(ans1<ans2)l=mid+0.000001,ans=mid;
else r=remid-0.000001,ans=remid;
if(r-l<=eps)break;
}
printf("%.5lf",ans);
return ;
}