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
",f(l));
   }
}



原文地址:https://www.cnblogs.com/814jingqi/p/3339249.html