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;
else
l = 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;
}
luogu1024 一元三次方程求解的更多相关文章
- NOIP2001 一元三次方程求解
题一 一元三次方程求解(20分) 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范 ...
- Vijos P1116 一元三次方程求解【多解,暴力,二分】
一元三次方程求解 描述 有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- 洛谷——P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- P1024 一元三次方程求解
P1024 一元三次方程求解 #include<cstdio> #include<iostream> #include<algorithm> using names ...
- 洛谷P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)
1038 一元三次方程求解 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 有形如:ax3+b ...
- luogu【P1024 一元三次方程求解】题解
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- NOIP2001 一元三次方程求解[导数+牛顿迭代法]
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
随机推荐
- C - Fafa and his Company
Problem description Fafa owns a company that works on huge projects. There are n employees in Fafa's ...
- Hadoop Hive概念学习系列之Hive里的2维坐标系统(第一步定位行键 -> 第二步定位字段)(二十三)
HBase里的4维坐标系统(第一步定位行键 -> 第二步定位列簇 -> 第三步定位列修饰符 -> 第四步定位时间戳) HBase里的4维坐标系统(第一步定位行键 ...
- http接口 两种调用http接口的方法
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; ...
- php获取当地时间 time zone
PHP5.2.4之前的版本无需设置时区.下面是修改PHP时区的三个办法. 1.修改PHP.ini这个文件 找到date.timezone这行,去掉前面的分号,改成: Java代码 date.tim ...
- 《java数据结构与算法》系列之“开篇”
大学的时候学习数据结构,当时吧虽然没挂这门课,但是确实学的不咋地,再但是其实自己一直都觉得数据结构很重要,是基础,只有基础好了,后面的路才能走的更好. 懒惰真的是天下的罪恶之源.所以一直到现在都毕业了 ...
- java的优先队列注意事项
在C++语言中,使用优先队列,直接构建一个lambda表达式,使用一个匿名函数指针.java比较函数的返回值不是bool型,只能是整型. 内部对应的C++匿名函数: // 匿名Comparator实现 ...
- SpringBoot入门系列(转)
SpringBoot入门系列:第一篇 Hello World http://blog.csdn.net/lxhjh/article/details/51711148
- (转)Bootstrap 之 Metronic 模板的学习之路 - (1)总览
https://segmentfault.com/a/1190000006673582#articleHeader0 写在前面 bootstrap 的模板非常多,Envato 上有着各种各样的免费及付 ...
- Memcached 之增删改查命令
memcache是高性能 ,分布式的内存对象缓存系统,非关系型数据库. 一.增 语法:add key flag expire length key:值的一个名字 flag:一个标志,是一个正整 ...
- BRAFT EDITOR富文本编辑器
https://braft.margox.cn/demos/basic 官方文档 import React from 'react' import Uploading from '../Upl ...