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; }