搜索初步-1005
2016-04-27 23:19
393 查看
[align=left]Problem Description[/align]
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?
[align=left]Input[/align]
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.
[align=left]Output[/align]
If he can go across the corner, print "yes". Print "no" otherwise.<br>
[align=left]Sample Input[/align]
10 6 13.5 410 6 14.5 4
[align=left]Sample Output[/align]
yesno汽车拐弯问题,给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。
其次我们发现随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解。
这里的Calc函数需要比较繁琐的推倒公式:
s = l * cos(θ) + w * sin(θ) - x;
h = s * tan(θ) + w * cos(θ);
其中s为汽车最右边的点离拐角的水平距离, h为里拐点最高的距离, θ范围从0到90。
3分搜索法
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?
[align=left]Input[/align]
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.
[align=left]Output[/align]
If he can go across the corner, print "yes". Print "no" otherwise.<br>
[align=left]Sample Input[/align]
10 6 13.5 410 6 14.5 4
[align=left]Sample Output[/align]
yesno汽车拐弯问题,给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。
其次我们发现随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解。
这里的Calc函数需要比较繁琐的推倒公式:
s = l * cos(θ) + w * sin(θ) - x;
h = s * tan(θ) + w * cos(θ);
其中s为汽车最右边的点离拐角的水平距离, h为里拐点最高的距离, θ范围从0到90。
3分搜索法
#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; }
相关文章推荐
- 搜索 初步 1020
- 搜索初步-1008
- 搜索初步-1002
- 1004-搜索初步
- NSArray排序简记
- Java ArrayList 的不同排序方法
- jQuery 遍历节点之next()方法
- 微信公众平台开发之申请微信开发测试号及花生壳内网映射
- CMD命令之BAT脚本路径信息
- 切片工具:把别家卫星图覆盖到百度地图上
- 剑指offer(3) 链表逆序输出
- java.util.regex.PatternSyntaxException: Unclosed character class near index解决办法
- python中的排序函数
- 标准的SVN目录结构
- WebStorm: 更改默认的文件模板
- (多核DSP快速入门)6.IPC的使用+实例分析
- hdu 5671 矩阵变换
- python给初学者的一些技巧和知识
- (prim算法题型一)求最小生成树的权值和、路径、边值的最小和最大值。
- java 基础一