ZOJ Monthly, June 2018 - E Chasing (三分)

点击打开链接


题意:

有A点和B点,都x<0,此时A点要跑到x>0的范围。给你B、A两点的速度之比。

B在追赶A,问你A能不能逃离。



POINT:

首先想到枚举A点逃离的位置,即Y轴上的所有点。然后算出A点和B点到这个点的距离之比。

在和速度之比相比较。就可以知道是否追上。

但是实数点是不能枚举的。

列出式子可知。

仅讨论B在A点左边的情况:dis(B,X)/dis(A,X)   在(0,+∞)=1  在(0,-∞)=1。

在(0,0)上>1。 所以是个先增后减的式子。

符合三分。


#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
const double eps=1e-9;
double xa,ya,xb,yb,k;


double cal(double y)
{
	double lena=sqrt(xa*xa+(ya-y)*(ya-y));
	double lenb=sqrt(xb*xb+(yb-y)*(yb-y));
	return lenb/lena;
}

double triserch(double l,double r)
{
	while(r-l>eps){
//		double mid = (r+l)/2;
//		double mmid=(mid+r)/2;
		double mid=l+(r-l)/3.0;
		double mmid=r-(r-l)/3.0;
		if(cal(mid)>cal(mmid))
			r=mmid;
		else
			l=mid;
	}
	return cal(l);
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf%lf%lf",&xa,&ya,&xb,&yb,&k);
		if(k<1.0){
			printf("N\n");
			continue;
		}
		double t=triserch(-1000000, 1000000);

		if(t>=k){
			printf("N\n");
		}else
			printf("Y\n");
	}


	return 0;
}


猜你喜欢

转载自blog.csdn.net/mr_treeeee/article/details/80976039