U62364 三次函数极值
题面
给定一个三次函数(f(x)=a_3x^3+a_2x^2+a_1x+a_0)
求其极值。
格式
输入包括一行四个整数(a_3,a_2,a_1,a_0)
输出包括几个坐标或-1.两个坐标时请先输出横坐标较小的。
样例#1
输入
2 -10 5 1
输出
(0.272233,1.66041)(3.0611,-20.0308)
样例#2
输入
1 0 0 0
输出
-1
数据限制
规模 | (a_i) |
---|---|
40% | ([-9,10]) |
60% | ([-299,700]) |
分析
当三次函数取得极值时,其导函数(f'(x)=0)
所以把三次函数求出导函数后,只需解一个一元二次方程。
解法
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
double calc(double x){
return ((a*x+b)*x+c)*x+d;
}
double l,m,n,delta;
int main(){
cin>>a>>b>>c>>d;
l=3*a;
m=2*b;
n=c;
delta=m*m-4*l*n;
if(delta>0){
double x1=(-m-sqrt(delta))/(2*l);
double x2=(-m+sqrt(delta))/(2*l);
cout<<"("<<x1<<","<<calc(x1)<<")("<<x2<<","<<calc(x2)<<")";
}else{
cout<<"-1";
}
}