生活随笔
收集整理的這篇文章主要介紹了
luogu1024 一元三次方程求解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意
已知一元三次方程\(ax^3+bx^2+cx+d=0\):
有且只有3個根對\(\forall x, x\in[-100,100]\)對\(\forall x_1,x_2,|x_1-x_2|\geq1\)定理:令\(f(x)=ax^3+bx^2+cx+d\),則\(f(l)f(r)<0\Leftrightarrow \exists x\in [l,r],使得f(x)=0\)思路
從拿到題開始我們很容易想到二分。二分求點都是求一個點,包含該點的區間具有某一特定性質,不包含這個點的區間不具有這一特定性質?!皡^間的特定性質”便是性質4。但是怎么保證區間中只有一個點呢?由性質3可得每個長度為1的區間最多有一個解。因此我們對于每個滿足性質4的長度為1的區間二分即可。
注意
- 長度為1的區間內的函數圖象不一定單調,所以\(f(\frac{l+r}{2})\)不具有任何代表性。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;const double EPS = 0.0001;
double A, B, C, D;double Bsearch(double l, double r, double k, double eps, double (*GetVal)(double, double))
{double mid;//printf("l %.2f r %.2f\n", l, r);while(r - l > eps){//printf("l %.2f r %.2f\n", l, r);mid=(l+r)/2.000;if(GetVal(l, mid) < k)r = mid;elsel = mid;}return mid;
}double Func(double x)
{return A * x * x * x + B * x * x + C * x + D;
}double GetVal(double l, double r)
{return Func(l) * Func(r);
}int main()
{cin>>A>>B>>C>>D;int ansCnt = 0;double ans[4];for(double l = -100; l <= 99; l += 1){double r = l + 1;//printf("l %.2f r %.2f\n", l, r);if(Func(l) == 0)ans[++ansCnt] = l;else if(Func(l) * Func(r) < 0){//printf("ok\n");ans[++ansCnt] = Bsearch(l, r, 0, EPS, GetVal);}}//printf("%.2f %.2f %.2f\n", ans[1], ans[2], ans[3]);//sort(ans+1, ans + 3 + 1);for(int i=1; i<=ansCnt; i++)printf("%.2f ", ans[i]);return 0;
}
轉載于:https://www.cnblogs.com/headboy2002/p/9080067.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的luogu1024 一元三次方程求解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。