一元三次方程 (codevs 1038)题解
【问题描述】
有形如: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 -5 -4 20
【样例输出】
-2.00 2.00 5.00
【解题思路】
本题为NOIP2001 提高组第二题,可用两种方法解决,枚举/二分,但老师改了一下数据,将保留2位改为了保留4位,导致枚举会超时,无奈之下用了二分……这里还是讲保留2位小数。题目中的提示已经完完全全告诉了我们思路,设f(x)=a*x^3+b*x^2+c*x+d,若用枚举,从-100开始,每次加0.01,按题目说明,如果f(x-0.005)*f(x+0.005)<0,那么,x即是答案(题目要求保留两位小数,只需write的时候加上:0:2即可,无需再判断x),或者f(x)本身就等于0,x也是答案。详见代码。
下面为二分题解。
二分是由分治策略引申的一种解题方法,比枚举会更快一些,所谓二分,就是将题目从中间分为两个部分,再对左右两边的分问题进行解答,将最终答案递归回来即可。
提示又给了我们很好的思路,这就是典型的二分了。如果f(x1)*f(x2)<0或者x1+1>x2,那么就从中间分为两个部分,为什么是或者呢?题目中说根与根的差的绝对值>=1,因此,如果我们找的两个数的差大于1,那么有可能这两个数中间不止存在一个解,因此也需要二分,利用这个特性,我们可以之间将-100与100二分。终止条件:(f(x)=0)or((x1+0.001>x2)and(f(x1)*f(x2)<0)这里的终止条件与枚举不同,但原理是一样的同样是因为需要保留两位小数,因此需要判断三位。详见代码。
【代码实现】
var a,b,c,d,x:real;
w:integer;
function f(x1:real):real;
begin
f:=a*x1*x1*x1+b*x1*x1+c*x1+d;
end;
begin
x:=-;
readln(a,b,c,d);
repeat
x:=x+0.01;
if (f(x)=) or (f(x-0.005)*f(x+0.005)<) then//注意这里的条件,有两种情况都算作根
begin
write(x::,' ');
inc(w);
end;
until w=;
end.
枚举法
var a,b,c,d:double;
i:longint;
function js(x:double):double;
begin
js:=a*x*x*x+b*x*x+c*x+d;
end;
procedure try(x1,x2:double);
var x0,y0,y1,y2:double;
begin
x0:=(x1+x2)/;
y0:=js(x0);y1:=js(x1);y2:=js(x2);
if (y0=)or((x1+0.001>x2)and(y1*y2<))then//满足条件,输出
begin
write(x0::,' ');
exit;
end;
if (y1*y0<)or(x0-x1>) then//注意题中说了两个解之间的差的绝对值>=,所以递归的条件不只是单纯的f(x1)*f(x0)<
try(x1,x0);
if (y0*y2<)or(x2-x0>) then
try(x0,x2);
end;
begin
readln(a,b,c,d);
try(-,);
end.
二分法
一元三次方程 (codevs 1038)题解的更多相关文章
- luogu【P1024 一元三次方程求解】题解
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- codevs 1038 一元三次方程求解 NOIP2001提高组
题目链接:http://codevs.cn/problem/1038/ 题解: 嗯,exm?才知道二分隶属搜索专题…… 对-100到100枚举,按照题目中的提示,当当fi*fi+1<0时,二分深 ...
- Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)
1038 一元三次方程求解 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 有形如:ax3+b ...
- 【CodeVS 1038】一元三次方程
题意 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的 ...
- 洛谷题解 P1024 【一元三次方程求解】
原题传送门 题目描述 有形如:ax^3+bx^2+cx^1+dx^0=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至10 ...
- 【CodeVS】p1038 一元三次方程求解
题目描述 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100 ...
- 1038 一元三次方程求解 2001年NOIP全国联赛提高组
题目描述 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- NOIP2001 一元三次方程求解[导数+牛顿迭代法]
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
随机推荐
- springMVC3 ckeditor3.6 图片上传 JS回调
一.引入js文件 <script type="text/javascript" src="<%=base %>/resources/ckeditor/c ...
- maven与git
================================================== maven的作用 ======================================== ...
- jdk集合常用方法分析之ArrayList&LinkedList&以及两者的对比分析
集合使用注意事项: 1.集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中去(JDK5之后会进行自动的装箱和拆箱操作,表面上看集合中是可以直接放置原生 ...
- 为什么要使用Spark?
现有的hadoop生态系统中存在的问题 1)使用mapreduce进行批量离线分析: 2)使用hive进行历史数据的分析: 3)使用hbase进行实时数据的查询: 4)使用storm进行实时的流处理: ...
- ASP.NET5 中静态文件的各种使用方式
所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...
- NSString用法
1 创造字符串 NSString *str1 = @"hello"; NSString *str2 = [NSString string]; NSString *str3 = [N ...
- jquery attr()和prop()方法的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 在.NET2.0中解析Json和Xml
在.NET解析json有很多方法,这里介绍最简单也用的最多的一种. 一.添加引用 解析Json,先下载开源控件 Newtonsoft.Json.dll 下载地址:http://files.cnblog ...
- kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
本项目作为kbengine服务端引擎的客户端演示而写 更新kbengine插件库(https://github.com/kbengine/kbengine_unity3d_plugins): ...
- zedboard上移植OPENCV库
zedboard上移植OPENCV库 之前做了很多移植OPENCV库的工作,但是需要包含的各种库,需要交叉编译,X264 ,JPGE ,FFMPGE等等 注意:在<嵌入式系统软硬件协同设计实战指 ...