nbut [1377] I Hate Math 输出f(x) = 2x^5 + 3x^4 + 4x^3 + 5x^2 - kx的最小解

  • http://acm.nbut.cn/Problem/view.xhtml?id=1377    飞机票一张

  • [1377] I Hate Math

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • There is a function: f(x) = 2x^5 + 3x^4 + 4x^3 + 5x^2 - kx. In short, your task is very simple: every time give you an integer k, calculate the minimun f(t), while 0<=t<=100.
  • 输入
  • For each case there is an integer k, k can be very large but I promise it is no more than the range of int.
  • 输出
  • For each case, print the minimun number for a given function, keep three decimal points please.
  • 样例输入
  • 0
    10
    100
    
  • 样例输出
  • 0.000
    -3.000
    -97.122
    
  • 提示
  • 来源
  • 小白菜

    输出 f(x)的最小解

    /*
    ]):①f’(0)>=0,那么导数恒不小于零,f(x)单调递增,所以f(x)在x=0处取得最小值。
    ②f’(100)<=0,那么导数恒不大于零,f(x)单调递减,所以f(x)在x=100处取得最小值。
    ③除①②种情况外,f’(x) = 0的解落在给定的定义域内,并且由f’(x)得f(x)先递减后递增,
    所以要先用二分法求得f’(x)=0的解,得到x=T,带回原函数即f(T)即为所求的最小值
    */
    #include<stdio.h>
    #include<math.h>
    double get(double x,double k)//导数
    {
    	return 10*x*x*x*x+12*x*x*x+12*x*x+10*x-k;
    }
    double getans(double x,double k)
    {
         return 2*x*x*x*x*x+3*x*x*x*x+4*x*x*x+5*x*x-k*x;
    }
    double erfen(double k)
    {
    	double start=0,end=100,mid;
    	double q;
    	while(end-start>0.0000001)
    	{
    		    mid=(end+start)/2.0;
    			q=get(mid,k);
                if(q<0.0000001)
    			{
                      start=mid;//+0.00001;
    			}
    			else if(q>0.00000001)
    			{
    				  end=mid;//-0.00001;
    			}
    			else if(fabs(q)<=0.0000001)
    				return mid;
    	}
    	return mid;
    }
    int main()
    {
    	double  k,f1,f2;
    	while(scanf("%lf",&k)!=EOF)
    	{
                   f1=get(0,k);
    			   f2=get(100,k);
    			   if(f1>=0&&f2>=0)
    			   {
                           printf("%.3lf\n",getans(0,k));
    					   
    			   }
    			   else
    			   if(f1<=0&&f2<=0)
    			   {
                           printf("%.3lf\n",getans(100,k));
    					   
    			   }
    			   else
    			   { 
    				    double pos=erfen(k);
    					//printf("pos=%lf\n",pos);
    	                 printf("%.3lf\n",getans(pos,k));
    			   }
    			   
    	}
    	return 0;
    }
     
    教训:
    一开始 没有看到x的范围 审题有错   自己读题老是读不完整 这个缺点很致命  
     
    另外发现自己的代码能力很弱   有空要多写写水题    练练代码能力  
    在写二分法的时候都写错了 造成了错误
     
    end-start>0.0000001  这个地方不能加fabs  因为可能后来start比end大 这时候也要退出
     
    mid=(end+start)/2.0;  我居然一开始用的减    阿弥陀佛 
     start=mid;//+0.00001;  不要加上那个偏移  因为可能把正确答案跳过去
     
    另外在网上看到有人说浮点型是没有办法进行二分法的 这样的观点应该是不正确的吧  
     
  • 另外 一定要在最后加上一个return mid; 
  • 因为也许根本找不到 或者什么原因 很接近 但是没有找到   就把mid返回 
     
     

  • 你可能感兴趣的:(nbut [1377] I Hate Math 输出f(x) = 2x^5 + 3x^4 + 4x^3 + 5x^2 - kx的最小解)