P2571 [SCOI2010]传送带

题目链接

题意分析

三分套三分

我们不经意间发现 这是一个单峰套单峰函数

我们假设

\(AB\)上最优点是\(x\) \(CD\)上最优点是\(y\)

那么就是求\(min\{dis(A,x)/p+dis(y,D)/q+dis(x,y)/r\}\)

我们首先 在\(AB\)上三分这个点\(x\)

然后在当前情况下再在\(CD\)上三分最优点\(y\)

然后就可以了

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 500008
#define IL inline
#define M 1008611
#define D double
#define eps 1e-7
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
    T __=0,___=1;char ____=getchar();
    while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
    while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
    _=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
D ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
IL D qury_dis(D cdy,D wzy,D zjz,D ghj)
{return sqrt((cdy-zjz)*(cdy-zjz)+(wzy-ghj)*(wzy-ghj));}
IL D solve_wzy(D nowx,D nowy)
{
	D fx=cx,fy=cy,tx=dx,ty=dy;
	while(qury_dis(fx,fy,tx,ty)>eps)
	{
		D tmpx=(tx-fx)/3.0,tmpy=(ty-fy)/3.0;
		D midx=fx+tmpx,midy=fy+tmpy,mmidx=tx-tmpx,mmidy=ty-tmpy;
		D resa=qury_dis(nowx,nowy,midx,midy)/r+qury_dis(midx,midy,dx,dy)/q,resb=qury_dis(nowx,nowy,mmidx,mmidy)/r+qury_dis(mmidx,mmidy,dx,dy)/q;
		if(resa>resb) fx=midx,fy=midy;
		else tx=mmidx,ty=mmidy;
	}
	return qury_dis(nowx,nowy,fx,fy)/r+qury_dis(fx,fy,dx,dy)/q;
}
IL D solve_cdy()
{
	D fx=ax,fy=ay,tx=bx,ty=by;
	while(qury_dis(fx,fy,tx,ty)>eps)
	{
		D tmpx=(tx-fx)/3.0,tmpy=(ty-fy)/3.0;
		D midx=fx+tmpx,midy=fy+tmpy,mmidx=tx-tmpx,mmidy=ty-tmpy;
		D resa=solve_wzy(midx,midy)+qury_dis(ax,ay,midx,midy)/p,resb=solve_wzy(mmidx,mmidy)+qury_dis(ax,ay,mmidx,mmidy)/p;
		if(resa>resb) fx=midx,fy=midy;
		else tx=mmidx,ty=mmidy;
	}
	return qury_dis(ax,ay,fx,fy)/p+solve_wzy(fx,fy);
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
	printf("%.2f\n",solve_cdy());
//	fclose(stdin);
//	fclose(stdout);
    return 0;
}


posted @ 2019-04-13 19:58  tcswuzb  阅读(154)  评论(0)    收藏  举报