zoukankan      html  css  js  c++  java
  • 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));
       }
    }
    



  • 相关阅读:
    第二周作业
    7-2 求最大值及其下标
    第十一周作业
    第九周编程总结
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第4周作业
    第三周作业
  • 原文地址:https://www.cnblogs.com/814jingqi/p/3339249.html
Copyright © 2011-2022 走看看