本文主要是介绍HDU 2899 Strange fuction(二分||三分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接~~>
做题感悟:这题和 2199 那题差不多。
解题思路:一、题目让求函数的最小值,首先应该分析函数图象。将函数求导得 f(x) ’ = 42 * x^6 + 48 * x^5 + 21 * x^2 + 10*x - y,因为 y 大于 0 所以假设存在 k 使f(x)'= 0,所以当0<=x<k 时f(x)’小于0,原函数在0<=x<k单调递减。在 k<x<=100 单调递增。所以函数先递减再递增。所以求导后求出x值然后带入原函数即为最小值。二、也可以用三分解决。
代码(二分):
#include<stdio.h>
#include<math.h>
double n ;
double find(double x) // 求导后的式子
{return 42.0*pow(x,6)+48.0*pow(x,5)+21.0*pow(x,2)+10.0*x ;
}
double binary_search(double x,double y)// 二分求 x 的值
{double mid,mx ;while(x<=y){mid=x+(y-x)/2.0 ;mx=find(mid) ;if(fabs(mx-n)<=0.0001)return mid ;elsemx > n ? y=mid : x=mid ;}return -1 ;
}
void print(double x)
{double mx=6.0*pow(x,7)+8.0*pow(x,6)+7.0*pow(x,3)+5.0*pow(x,2)-n*x ;printf("%.4lf\n",mx) ;
}
int main()
{int T ;scanf("%d",&T) ;while(T--){scanf("%lf",&n) ;double mx=binary_search(0,100) ;print(mx) ;}return 0 ;
}
代码(三分):
#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std ;
const double EPS = 0.00001 ;
double y ;
double find(double x)
{return 6.0*pow(x,7)+8.0*pow(x,6)+7.0*pow(x,3)+5.0*pow(x,2)-y*x ;
}
double third_search(double x,double y)
{double mid,midd ;while(x+EPS<y){mid=(y+x)/2.0 ;midd=(y+mid)/2.0 ;if(find(mid)<find(midd))y=midd ;else x=mid ;}return find(mid) ;
}
int main()
{int T ;scanf("%d",&T) ;while(T--){scanf("%lf",&y) ;printf("%.4lf\n",third_search(0,100)) ;}return 0 ;
}
这篇关于HDU 2899 Strange fuction(二分||三分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!