1.序号:1002-Strange fuction
2.题意:给出一个方程,F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x ,其中x在0到100之间,第一行输入一个T,代表输入几个数据Y,,Y即为方程中的y,然后在0<=x<=100的范围内求方程F(x)的最小值,输出最小值。
3.解题思路:这道题与1001那道题很相似。对方程进行一次求导,就是每个点的斜率,就像路程S求一次导就是速度V一样,v为负,s就变小,v为正,s就大。首先定义了两个方程,equ_fir是原方程,equ是求导后的方程,对于求导后的方程有三种情况,第一当y很大,x=100的时候方程也为负,说明方程在0<=x<=100的范围内一直为负,那方程就是一直递减的,当x=100的时候最小,第二当y很小,x=0的时候方程也为正,说明方程在0<=x<=100的范围内一直为正,那方程就是一直递增的,第三就是方程先减后增,要求方程=0的解,这与1001题一样,求出=0的解将这个解带入原方程就是最终的输出。
4.感想:这道题跟1001那道前面几乎都一样,就是在后面又加上一些步骤,基本上一样的,做这道题觉得acm与数学就是联系在一起的,acm主要是算法问题,今天这道题的求导问题,我当时就在想,求一次还是求两次,用了路程、速度、加速度做例子想了一下,数学好多题都有一些遗忘了,希望能把它们慢慢拾起来。
5.AC代码:
#include <iostream> #include <stdio.h> #include <cmath> using namespace std; double equ_fir(double x,double y) { return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-x*y; } double equ(double x) { return 42*pow(x,6)+48*pow(x,5)+21*x*x+x*10; } int main() { int n; double ans; double y; cin>>n; for(int i=0;i<n;i++) { double l=0,h=100,mid,co; cin>>y; if(y<equ(0)) { cout<<equ_fir(0,y)<<endl; continue; } else if(y>equ(100)) { cout<<equ_fir(100,y)<<endl; continue; } else { while(h-l>1e-8) { mid=(h+l)/2; if(equ(mid)<y) {l=mid;} else if(equ(mid)>y) {h=mid;} else {l=mid;h=mid;} } ans=equ_fir((h+l)/2,y); printf("%.4lf\n",ans); } } return 0; }