您的位置:首页 > 其它

bzoj 1857: [Scoi2010]传送带 三分

2017-03-22 20:23 393 查看
三分:

单峰函数求最值,设$mid1=l+(r-l)/3$,$mid2=l+2*(r-l)/3$。

假设是一个上凸的函数,当$f(mid1)<f(mid2)$,$mid1$左侧不可能有最值。

否则$mid2$右侧不可能有最值。

这道题如果固定住一个点那另一个点的位置与时间关系是一个单峰函数,具体可以用求导找零点证。

那就推测选的第一个点的函数也是单峰的,直接三分套三分就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double ax,ay,bx,by,cx,cy,dx,dy;
double p,q,r;
const double eps=1e-3;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double a1,a2;
double cal(double x,double y)
{
double lx=cx,ly=cy,rx=dx,ry=dy;
double x1,y1,x2,y2,t1,t2;
while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
{
x1=lx+(rx-lx)/3;y1=ly+(ry-ly)/3;
x2=lx+(rx-lx)/3*2;y2=ly+(ry-ly)/3*2;
t1=dis(a1,a2,x,y)/p+dis(x1,y1,x,y)/r+dis(x1,y1,dx,dy)/q;
t2=dis(a1,a2,x,y)/p+dis(x2,y2,x,y)/r+dis(x2,y2,dx,dy)/q;
if(t1>t2)
{
lx=x1;ly=y1;
}
else
{
rx=x2;ry=y2;
}
}
return dis(a1,a2,x,y)/p+dis(lx,ly,x,y)/r+dis(lx,ly,dx,dy)/q;
}
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 x1,y1,x2,y2,t1,t2;
a1=ax;a2=ay;
while(fabs(bx-ax)>eps||fabs(by-ay)>eps)
{
x1=ax+(bx-ax)/3;y1=ay+(by-ay)/3;
x2=ax+(bx-ax)/3*2;y2=ay+(by-ay)/3*2;
t1=cal(x1,y1);t2=cal(x2,y2);
if(t1>t2)
{
ax=x1;ay=y1;
}
else
{
bx=x2;by=y2;
}
}
printf("%.2lf\n",cal(ax,ay));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: