HDOJ/HDU 2438 计算几何+三分

Turn the corner

Time Limit:1000MS  Memory Limit:32768K
Total Submit:16 Accepted:9

Description

Mr. West bought a new car! So he is travelling around the city.
One day he comes to a vertical corner. The street he is currently in has a width x, the street he wants to turn to has a width y. The car has a length l and a width d.
Can Mr. West go across the corner?



Input

Every line has four real numbers, x, y, l and w.
Proceed to the end of file.

Output

If he can go across the corner, print "yes". Print "no" otherwise.

Sample Input

10 6 13.5 4
10 6 14.5 4

Sample Output

yes
no

Hint

hdoj2438
有链接提示的题目请先去链接处提交程序,AC后提交到SDUTOJ中,以便查询存档。

Source

2008 Asia Harbin Regional Contest Online


最近一直在修炼三分技术。

顿然发现,所有三分似乎都与计算几何有关。。。好神奇的说。。。。

扯远了。。回到这个题目。

这个题目,我的写法和后来看到的标准写法不一样。

标准写法是去计算那个sita,而我的是。

我三分的是那个车与直角围城的三角心的一个底边长度

通过计算内拐点,到那条直线的最短距离来判断到底是不是输出yes或者no


详细见代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define eps 1e-8

struct point
{
	double x;
	double y;
};
double w1,w2,l,d;

double cross(point p1,point p2,point p0)
{
	return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

double cal(double x)
{
	point t1,t2,p0;
	double s,y,h;
	y=sqrt(l*l-x*x);
	t1.x=w1-x,t1.y=-w2;
	t2.x=w1,t2.y=-(w2-y);
	p0.x=0,p0.y=0;
	s=fabs(cross(t1,t2,p0));
	h=s/l;
	return h;
}

void solve()
{
	int i;
	double left,right,mid1,mid2,h1,h2;
	left=0,right=l;
	for(i=0;i<=100;i++)
	{
		mid1=(left*2+right)/3;
		mid2=(left+right*2)/3;
		h1=cal(mid1);
		h2=cal(mid2);
		if(h1>h2)
		{
			left=mid1;
		}
		else
		{
			right=mid2;
		}
	}
	double H=cal(left);
	if(H-d>0)
		printf("yes\n");
	else
		printf("no\n");
}

int main()
{
	while(scanf("%lf%lf%lf%lf",&w1,&w2,&l,&d)!=EOF)
	{
		if(d>=w1||d>=w2)
		{
			printf("no\n");
			continue;
		}
		solve();
	}
	return 0;
}


你可能感兴趣的:(HDOJ/HDU 2438 计算几何+三分)