BZOJ 1857: [Scoi2010]传送带

三分是挺显然的,但是这题不是一个三分就能解决的,而需要两个三分。一个一条传送带,两条传送带需要两个三分。
三分在第一条传送带行走的路程,然后通过这个枚举的mid来求出在第一题传送带行走mid距离后的位置;三分在第二条传送带行走的路程,然后通过这个枚举的mid2来求出在第二条传送带行走mid2后的位置;最后加上两个位置之间的时间即可。
这样枚举的话算位置挺麻烦的,要推一波麻烦的三角公式,并且再算斜率的时候还要判断一下两个x坐标是否相同,不然可能会出现除以0的情况。
有题解是三分x坐标和y坐标的位置,就十分方便了。
#include <bits/stdc++.h>
#define eps 1e-10
using namespace std;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r,dis1,dis2;

inline double dis(double x1,double y1,double x2,double y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

inline double jay(double mid,double x,double y)
{
	double nowx,nowy,posx,posy;
	if (fabs(dx-cx)>eps)
	{
		nowx=sqrt(mid*mid/(1+((dy-cy)/(dx-cx))*((dy-cy)/(dx-cx))));
		//世事无常,一开始写的时候由于读入p,q,r是int类型导致答案均为inf,一气之下重写代码
		//然后就发现公式这里需要 ((dy-cy)/(dx-cx))*((dy-cy)/(dx-cx)),本来写的是 (dy-cy)/(dx-cx)
		nowy=fabs((dy-cy)/(dx-cx)*nowx);
	}
	else
	{
		nowx=0;
		nowy=mid;
	}
	if (dx>cx) posx=dx-nowx; else posx=dx+nowx;
	if (dy>cy) posy=dy-nowy; else posy=dy+nowy;
	
	double ans;
	ans=dis(x,y,posx,posy)/r+dis(posx,posy,dx,dy)/q;
	return ans;
}

inline double check(double mid)
{
	double nowx,nowy,posx,posy;
	if (fabs(bx-ax)>eps)
	{
		nowx=sqrt(mid*mid/(1+((by-ay)/(bx-ax))*((by-ay)/(bx-ax))));
		nowy=fabs((by-ay)/(bx-ax)*nowx);
	}
	else
	{
		nowx=0;
		nowy=mid;
	}
	if (ax>bx) posx=ax-nowx; else posx=ax+nowx;
	if (ay>by) posy=ay-nowy; else posy=ay+nowy;
	
	double l,r,lmid,rmid;
	l=0; r=dis2;
	while (r-l>=eps)
	{
		lmid=l+(r-l)/3; rmid=r-(r-l)/3;
		if (jay(lmid,posx,posy)<=jay(rmid,posx,posy)) r=rmid;
		else l=lmid;
	}
	double ans;
	ans=mid/p+jay(l,posx,posy);
	return ans;
}

int main(){
	scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
	scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy);
	scanf("%lf%lf%lf",&p,&q,&r);
	dis1=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
	dis2=sqrt((cx-dx)*(cx-dx)+(cy-dy)*(cy-dy));
	
	double l,r,lmid,rmid;
	l=0; r=dis1;
	while (r-l>=eps)
	{
		lmid=l+(r-l)/3; rmid=r-(r-l)/3;
		if (check(lmid)<=check(rmid)) r=rmid;
		else l=lmid;
	}
	double ans;
	ans=check(l);
	printf("%.2f\n",ans);
return 0;
}
发布了64 篇原创文章 · 获赞 29 · 访问量 671

猜你喜欢

转载自blog.csdn.net/Dove_xyh/article/details/103978766
今日推荐