1002
来源:互联网 发布:美工的工作内容 编辑:程序博客网 时间:2024/06/18 13:12
简单题意:给定一个公式:6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;求所要求的满足公式的最小X值
解题思路:看到这题,第一反应就是和1001很类似,唯一不同的就是多了一个变量y。刚开始的时候我以为,套用第一题的模式就可以,可是后来发现,原式子用二分法,求出的只是一个解。最小解却求不出来。要求最小解,就要用到数学中的导数思想,对原式进行求导,可得42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;无论y取值如何,42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x,是递增的,只需要求出42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y=0.的X值。即为原函数的极小值也是最小值,对导函数进行二分法,求出满足42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y=0的x值即可
感想:关于数学的问题,忘的差不多了,这里虽然没有牵扯到二次求导,但是原理是一样的,判断导函数递增是需要用到二次求导的,ACM越做越发现和数学的关系密切。能够利用数学知识解决问题,也算是对所学知识的一种应用吧
AC代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
double y;
const double eps=1e-6;
double func(double x)
{
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2);
}
double fun(double x)
{
return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x;
}
int main()
{
int T;
double y;
cin>>T;
while(T--)
{ cin>>y;
if(y>=func(100))
cout << func(100)-y*100 << endl;
else
{ double low=0,high=100,mid;
while(high-low>=eps)
{
mid=(high+low)/2;
if(fun(mid)>y)
high=mid;
else
low=mid;
}
printf("%.4lf\n",func(mid)-y*mid);}
}
return 0;
}
- 1002 。
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- 1002
- java内存优化-程序监控
- Error: Unable to retrieve volume limit information.
- Block(块)介绍之四:回调CallBack
- 如何把自己打造成技术圈的 papi 酱
- linux调度器源码分析 - 新进程加入(三)
- 1002
- Qt tab标签页
- 数据结构 图
- 使用git pull文件时和本地文件冲突怎么办?
- TotoiseSVN的基本使用方法
- 关于cocos2d对ETC1图片的支持
- java,foreach语句
- 收集各种 iOS App 开发可以用到的代码示例
- 指针函数和函数指针