[NOIP提高&洛谷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)之间一定有一个根。
输入格式:一行,4个实数A,B,C,D。
输出格式:一行,三个实根,并精确到小数点后2位。
Solution
1.考虑valid函数的写法,因为无法简单的解一元三次方程,我们不妨把方程看做函数f(x),对于自变量x,返回其对应的f(x),即:
double valid(double x){
double num=x*x*x*a+x*x*b+x*c+d;
return num;
}
2.考虑因为根与根之差的绝对值>=1,在同一个宽度为1的区间内不会存在两个根,所以可以枚举-100~100之间的每一个宽度为1的区间,对每个区间进行二分;
3.对于每一个区间[L,L+1)首先判断根是否在1其中,根据零点的存在性定理,当 valid(l)* valid(l+1)≤ 0时,零点才存在于这个区间;
4.如果存在,首先检验l是否为解,若不是,二分区间,直至左右端点差值满足精度要求为止;
5.注意:因为我们枚举的是区间[L,L+1),所以100没有被检验过,最后记得检验100是否为根;
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int i,j,k;
double l,r,mid,a,b,c,d;
double valid(double x){
double num=x*x*x*a+x*x*b+x*c+d;
return num;
}
int main(){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(i=-100;i<100;++i)
if(valid(i)==0)printf("%.2lf ",(double)i);
else if(valid(i)*valid(i+1)<0){
l=i;r=l+1;
while(r-l>=0.001){
mid=(l+r)/2;
if(valid(l)*valid(mid)<=0)r=mid;
else l=mid;
}
printf("%.2lf ",l);
}
if(valid(100)==0)printf("100.00");
printf("\n");
return 0;
}
二分答案的基础参考以前的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8543330.html
[NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)的更多相关文章
- 洛谷 [P1024]一元三次方程求解【二分答案】
题目链接:https://www.luogu.org/problemnew/show/P1024 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b ...
- 洛谷——P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- 洛谷P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- [NOIP2001] 提高组 洛谷P1024 一元三次方程求解
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- 【洛谷P1024一元三次方程求解】
题目描述 有形如: ax3 + bx2 + cx1 + dx0 = 0 这样的一个一元三次方程.给出该方程中各项的系数( a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在 -100 ...
- 洛谷 [P1024]一元三次方程求解
一道水题然而坑点很多. #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
- 洛谷P1024 一元三次方程求解(数学)
题意 题目链接 Sol 本来是一道好的公式题. 然后输出只要保留两位小数?? 直接上不就赢了嘛.. #include<bits/stdc++.h> #define LL long long ...
- P1024 一元三次方程求解(二分答案)
思路: 求这个根,然后有一个关键的条件|x1-x2|>=1,然后就是从-100,枚举到+100,每次二分(i, i+1)注意如果f(i)*f(i+1)>0则不进行二分,如果,你觉得这样的值 ...
- P1024 一元三次方程求解
P1024 一元三次方程求解 #include<cstdio> #include<iostream> #include<algorithm> using names ...
随机推荐
- 简易版本vue的实现和注解
本文参考的是前辈的简易版本Vue实现:http://www.cnblogs.com/canfoo/p/6891868.html,感谢.前辈GitHub地址:https://github.com/can ...
- 通过分析java heap dump解决生产问题
最近在生产环境遇到一个问题,正常情况下,ECS CPU始终保持在10%以下,内存也只占用40%左右,但是连续2天出现了CPU占用100%的情况,然后系统卡住.看阿里云的ECS监控,能看到CPU飙到了1 ...
- SpringBoot(六)_AOP统一处理请求
什么是AOP AOP 是一种编程范式,与编程语言无关: 将通用逻辑从业务逻辑中分离出来(假如你的业务是一条线,我们不在业务线上写一行代码就能完成附加任务!我们会把代码写在其他的地方): 具体实现 (1 ...
- Android Studio系列教程
Android Studio系列教程 Android Studio系列教程一 —- 下载与安装 Android Studio系列教程二 —- 基本设置与运行 Android Studio系列教程三 — ...
- Java并发编程中的设计模式解析(二)一个单例的七种写法
Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
- Yarn源码分析1(Hadoop2.7.2)
在Hadoop中,调度框架YARN(Yet Another Resource Negotiater)是基于事件的,调度的是MapReduce的Application.Application有一系列的状 ...
- HDU 6166 Senior Pan(二进制分组+最短路)
题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...
- HotSpot垃圾收集器GC的种类
堆内存的结构:
- c++11 可变参数模板函数
c++11 可变参数模板函数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #in ...
- NOI前总结
最近也就是天天考试,总结一下. 7.1 开场T1T2都是不可做的概率期望,只有T3看起来可做,于是怒干4h+,将题解里面的所有结论都推出来了,大模拟写的一点毛病都没有,可还是因为2-SAT掌握不熟结果 ...