Turn the corner
2016-04-23 10:50
190 查看
Problem 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?
[align=left]Input[/align]
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.<br>
[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 4
10 6 14.5 4
[align=left]Sample Output[/align]
yes
no
题意:有一个宽w,长l的车要从宽度为x的街道转到宽度为y的街道,问问能不能过去。
思路:看到这个题,不知道怎么下手。下面是参考的思路
分析:汽车能否顺利转弯取决于在极限情况下,随着角度的变化,汽车离对面路的距离是否大于等于0
如图中
在上图中需要计算转弯过程中h 的最大值是否小于等于y很明显,随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解
开始的时候我在考虑关于汽车尾部能不能过去,最后才知道我们首先保证的是汽车尾部最低要求可以通过,然后再求汽车拐弯所需要的最小高度。
三分求解代码:
#include <iostream>
#include<math.h>
using namespace std;
//x,y表示道路的宽度
//l,w表示汽车长度和宽度
double x,y,l,w;
//定义PI,360度
const double PI = 3.141592653;
double cal(double ag){
//推出的汽车拐弯时所需要的最小高度公式
double s = l * cos(ag) + w * sin(ag) - x;
double h = s * tan(ag) + w * cos(ag);
return h;
}
int main()
{
while(cin >> x >> y >> l >> w){
//变量从0度到180度
double left = 0.0,right = PI/2;
double lm,rm;
//通过三分求出凸点
while((right-left) > 10e-6){
/*
//不懂
lm = (left * 2.0 + right)/3.0;
rm = (left + right * 2.0)/3.0;
*/
//常规三分
lm = (left + right)/2.0;
rm = (lm + right)/2.0;
if(cal(lm) > cal(rm)){
right = rm;
}
else{
left = lm;
}
}
if(cal(left) <= y){
cout << "yes" << endl;
}
else{
cout << "no" << endl;
}
}
return 0;
}
参考了别人的三分代码,不过没有搞懂,最后用的自己的常规三分。不过效果是一样的
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.<br>
[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 4
10 6 14.5 4
[align=left]Sample Output[/align]
yes
no
题意:有一个宽w,长l的车要从宽度为x的街道转到宽度为y的街道,问问能不能过去。
思路:看到这个题,不知道怎么下手。下面是参考的思路
分析:汽车能否顺利转弯取决于在极限情况下,随着角度的变化,汽车离对面路的距离是否大于等于0
如图中
在上图中需要计算转弯过程中h 的最大值是否小于等于y很明显,随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解
开始的时候我在考虑关于汽车尾部能不能过去,最后才知道我们首先保证的是汽车尾部最低要求可以通过,然后再求汽车拐弯所需要的最小高度。
三分求解代码:
#include <iostream>
#include<math.h>
using namespace std;
//x,y表示道路的宽度
//l,w表示汽车长度和宽度
double x,y,l,w;
//定义PI,360度
const double PI = 3.141592653;
double cal(double ag){
//推出的汽车拐弯时所需要的最小高度公式
double s = l * cos(ag) + w * sin(ag) - x;
double h = s * tan(ag) + w * cos(ag);
return h;
}
int main()
{
while(cin >> x >> y >> l >> w){
//变量从0度到180度
double left = 0.0,right = PI/2;
double lm,rm;
//通过三分求出凸点
while((right-left) > 10e-6){
/*
//不懂
lm = (left * 2.0 + right)/3.0;
rm = (left + right * 2.0)/3.0;
*/
//常规三分
lm = (left + right)/2.0;
rm = (lm + right)/2.0;
if(cal(lm) > cal(rm)){
right = rm;
}
else{
left = lm;
}
}
if(cal(left) <= y){
cout << "yes" << endl;
}
else{
cout << "no" << endl;
}
}
return 0;
}
参考了别人的三分代码,不过没有搞懂,最后用的自己的常规三分。不过效果是一样的
相关文章推荐
- 1013&&1014上下楼梯
- Linux基础之文件与目录管理
- [置顶] Ubuntu docker spark集群部署
- 【安卓与物联网】Arduino开发板与Android之间通信
- freemarker页面String类型的日期格式,实体类Date类型的----------处理方法
- Handler
- bc div.2 1003 String【考思路】
- 浅谈PHP中的<<<运算符
- crc计算
- 前端框架 seajs 使用总结
- Netmap分析(六)
- 【java设计模式】之 工厂(Factory)模式
- poj 1887 Testing the CATCHER
- 事务的隔离级别
- memcached安装部署及启动错误排查
- 新颖的小动画
- 编程之美之发帖水王
- 线上机器被干掉 简述 处理流程(淡定是第一位的)。
- android的广播机制简介
- win7 下搭建前端开发环境 sublime-text3