zoj 3366 Light Bulb 三分
题目地址: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)); } }