HDU 2899 Strange fuction(二分||三分)

举报
Linux猿 发表于 2021/08/05 01:21:47 2021/08/05
【摘要】 题目链接~~> 做题感悟:这题和 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,原...

题目链接~~>

做题感悟:这题和 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值然后带入原函数即为最小值。二、也可以用三分解决。

代码(二分):


  
  1. #include<stdio.h>
  2. #include<math.h>
  3. double n ;
  4. double find(double x) // 求导后的式子
  5. {
  6. return 42.0*pow(x,6)+48.0*pow(x,5)+21.0*pow(x,2)+10.0*x ;
  7. }
  8. double binary_search(double x,double y)// 二分求 x 的值
  9. {
  10. double mid,mx ;
  11. while(x<=y)
  12. {
  13. mid=x+(y-x)/2.0 ;
  14. mx=find(mid) ;
  15. if(fabs(mx-n)<=0.0001)
  16. return mid ;
  17. else
  18. mx > n ? y=mid : x=mid ;
  19. }
  20. return -1 ;
  21. }
  22. void print(double x)
  23. {
  24. double mx=6.0*pow(x,7)+8.0*pow(x,6)+7.0*pow(x,3)+5.0*pow(x,2)-n*x ;
  25. printf("%.4lf\n",mx) ;
  26. }
  27. int main()
  28. {
  29. int T ;
  30. scanf("%d",&T) ;
  31. while(T--)
  32. {
  33. scanf("%lf",&n) ;
  34. double mx=binary_search(0,100) ;
  35. print(mx) ;
  36. }
  37. return 0 ;
  38. }

代码(三分):


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<string>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<math.h>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std ;
  11. const double EPS = 0.00001 ;
  12. double y ;
  13. double find(double x)
  14. {
  15. return 6.0*pow(x,7)+8.0*pow(x,6)+7.0*pow(x,3)+5.0*pow(x,2)-y*x ;
  16. }
  17. double third_search(double x,double y)
  18. {
  19. double mid,midd ;
  20. while(x+EPS<y)
  21. {
  22. mid=(y+x)/2.0 ;
  23. midd=(y+mid)/2.0 ;
  24. if(find(mid)<find(midd))
  25. y=midd ;
  26. else x=mid ;
  27. }
  28. return find(mid) ;
  29. }
  30. int main()
  31. {
  32. int T ;
  33. scanf("%d",&T) ;
  34. while(T--)
  35. {
  36. scanf("%lf",&y) ;
  37. printf("%.4lf\n",third_search(0,100)) ;
  38. }
  39. return 0 ;
  40. }



 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/17526789

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。