您的位置:首页 > 其它

The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemB:Light Bulb

2016-07-14 17:45 471 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203



题意:求影子的最长长度L;

当灯,人头和墙角成一条直线时(假设此时人站在A点),此时的长度是影子全在地上的最长长度。当人再向右走时,影子开始投影到墙上,当人贴着墙,影子长度即为人的高度。所以当人从A点走到墙,函数是先递增再递减,为凸性函数,所以我们可以用三分法来求解。

我们假设:人距离灯的水平距离为x,则不难推出:随着x的变化,L = D - x + H - D * (H - h) / x; 是先增后减函数。

我们立足于求其最大值。

x的初始值我们可以假设为:D - D*h/H,因为从0开始到此,L肯定是递增的,所以不必考虑先前的。

x最大值为D:

题解参考:http://blog.csdn.net/niuox/article/details/8529986

三分法详细介绍:http://www.debug4.me/Algorithm/ternary-search/

#include<bits/stdc++.h>
using namespace std;

double H,h,D;
double aa(double x) {
return (h-x)*D/(H-x)+x;
}
int main() {
double l,r,m,mm;
int t;
scanf("%d",&t);
while(t--) {
scanf("%lf%lf%lf",&H,&h,&D);
l=D-D*h/H;
r=h;
while(l+1e-6<r) {
m=(l+r)/2;
mm=(m+r)/2;
if(aa(m)>aa(mm))
r=mm;
else
l=m;
}
printf("%.3lf\n",aa(l));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: