题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3366
思路: 题目就是要求函数 (h*D-H*x)/(D-x)+x 的最大值,其中 x>=0 x<=h/H*D;
一开始直接求导,令导数为0
得到wa的程序:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int T;
cin>>T;
long double H,h,D;
while(T--)
{
cin>>H>>h>>D;
long double ans=D*H-D*h;
ans=sqrt(ans);
ans*=-2;
ans+=H+D;
cout<<ans<<endl;
}
}
答案和正确答案还是蛮接近的~ 但是没有考虑区间问题~
然后,只考虑影子分为两段的情况(因为影子头部刚到墙角考虑到了,它对应的状态一定优于一直在地面上的那段区间对应的状态)
其中x是表示里墙角的距离
#include<iostream>
#include<cstdio>
using namespace std;
double H,h,D;
double f(double x)
{
return (h*D-H*x)/(D-x)+x;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>H>>h>>D;
double l=0;
double r=h/H*D;
double m1,m2;
while(r-l>1e-4)
{
m1=l+(r-l)/3;
m2=r-(r-l)/3;
if(f(m1)>f(m2)) r=m2;
else l=m1;
}
printf("%.3lf\n",f(l));
}
}