OVSolitario-io

导航

luoguP1024-二分

题目链接
实数二分:实数二分不存在边界问题,二分时可以设立循环次数或确立精度

1.若存在 2个数 x1和 x2,且x1<x2, f(x1)×f(x2)<0之间一定存在它的一个浮点数根
2.且题目给定实根范围在-100~100之间,按位枚举方程= 0时,显然x是方程的一个整数实根

题目描述
有形如:ax3+bx2+cx+d=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实(根的范围在 −100至 100之间),且根与根之差的绝对值 ≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 2位。

提示:记方程 f(x)=0,若存在 2个数 x1和 x2,且x1<x2, f(x1)×f(x2)<0,则在 (x1,x2)之间一定有一个根。

输入格式
一行,4个实数 a,b,c,d。

输出格式
一行,3个实根,从小到大输出,并精确到小数点后 2位。

样例 #1
样例输入 #1
1 -5 -4 20
样例输出 #1
-2.00 2.00 5.00
提示
【题目来源】
NOIP 2001 提高组第一题

ACcode:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 2 * 1e5 + 10;

typedef long long LL;

double a, b, c, d;

double formula(int x)
{
    return a * x * x * x + b * x * x + c * x + d;
}
int main()
{ 
    cin >> a >> b >> c >> d;
    for(int i = - 100; i < 100; ++ i)
    {
        double l = i, r = i + 1, mid = 0;
        if(formula(l) == 0) {
            printf("%.2f ", l);
            continue;
        }
        if(formula(l) * formula(r) < 0) {
            for(int j = 0; j < 61; ++ j)
            {
                mid = (l + r) / 2;
                if(formula(l) * formula(mid) <= 0) r = mid;//l和mid<=0,说明答案在左边,反之亦然
                else l = mid;
            }
            printf("%.2f ", l);
        }
    }
    return 0;
}

当时思路:没有进行深入思考,其实是一道简单题

posted on 2024-04-04 17:13  TBeauty  阅读(20)  评论(0)    收藏  举报