【noi 2.2_7891】一元三次方程求解(二分枚举)

对于noi上的题有2中解法:

1.数据很小(N=100),可以直接打for循环枚举和判断。

2.不会“三分”,便用二分。利用“两根相差>=1”和 f(x1)*f(x2)<0,转换意思为[x,x+1]内不会包含两个根,这样枚举可以保证不漏解。因此,枚举一个个根所在的区间,再用二分枚举找出根。其中,若N=10^5,由于保留2位小数,最好精确到4位小数计算。时间复杂度 O(N)=10^5+3*log(10^4),约为10^5。

以下附上二分的代码——

 1 //20160908 Ann
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<iostream>
 6 using namespace std;
 7 //#include<ctime>
 8
 9 //eps. epsilon 精确度
10 const double eps=1e-4,INF=1e4;
11 double a,b,c,d;
12
13 double f(double x)
14 {   return a*x*x*x+b*x*x+c*x+d;  }
15
16 double bisec(double l,double r)
17 {
18     if (f(l)==0) return l;
19     if (f(r)==0) return INF;
20     if (f(l)*f(r)>0) return INF;
21     double m;
22     while (l+eps<r)
23     {
24       m=(l+r)/2;
25       if (f(m)==0) return m;
26       if (f(l)*f(m)<0) r=m-eps;
27       else l=m+eps;
28     }
29     return l;
30 }
31
32 int main()
33 {
34     //freopen("a.in","r",stdin);
35     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
36     int cnt=0;
37     for(double i=-100.0;i<=100.0;i+=1.0)
38     {
39       double x=bisec(i,i+1.0);
40       if (x!=INF) cnt++,printf("%.2lf ",x);
41       if (cnt==3) break;
42     }
43     //printf("\nTime used = %.2lf\n",(double)clock()/CLOCKS_PER_SEC);
44     return 0;
45 }
时间: 2024-12-15 04:48:53

【noi 2.2_7891】一元三次方程求解(二分枚举)的相关文章

算法训练——一元三次方程求解

//一元三次方程求解 //直接枚举 #include<stdio.h> #include<math.h> double a,b,c,d,x; double f(double x){ return a*x*x*x + b*x*x + c*x + d; } int main(){ scanf("%lf%lf%lf%lf",&a,&b,&c,&d); for(x=-100;x<=100;++x){ double z = x,y =

[NOIP提高&amp;洛谷P1024]一元三次方程求解 题解(二分答案)

[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如: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)之间一定

Vijos P1116 一元三次方程求解【多解,暴力,二分】

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

NOIP2001 一元三次方程求解

题一  一元三次方程求解(20分) 问题描述 有形如: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)之间一定有一个 根. 样例 输入:1  

一元三次方程求解(折半查找)

Description 有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.请你求出这个方程的三个实根. Input 只有一行,包括4个实数a,b,c,d,中间用一个或多个空格隔开. Output 只有一行,包括三个整数,为由小到大排列的三个实根(根与根之间留有空格),并精确到小数点后2位. Sample Input 1   -5   -4

1238:一元三次方程求解

[原始题目] 1238:一元三次方程求解 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4113 通过数: 2017 [题目描述] 形如:ax3+bx2+cx+d=0ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,da,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在−100−100至100100之间),且根与根之差的绝对值≥11.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后22位.

二分查找(vijos1116一元三次方程求解NOIP2001第一题)

有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 输入该方程中各项的系数(a,b,c,d 均为实数), 由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 样例输入1 1 -5 -4 20 样例输出1 -2.00 2.00

洛谷 [P1024]一元三次方程求解【二分答案】

题目链接:https://www.luogu.org/problemnew/show/P1024 题目描述 有形如: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,

一元三次方程求解(数学、二分)

https://www.luogu.com.cn/problem/P1024 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求三个实根. Input 四个实数:a,b,c,d Output 由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位 Sample Input 1 -5 -4