UVa 10341 - Solve It【经典二分,单调性求解】
原题:
Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1.
Input
Input consists of multiple test cases and terminated by an EOF. Each test case consists of 6 integers in a single line: p, q, r, s, t and u(where 0 <= p,r <= 20 and -20 <= q,s,t <= 0). There will be maximum 2100 lines in the input file.
Output
For each set of input, there should be a line containing the value of x, correct upto 4 decimal places, or the string "No solution", whichever is applicable.
Sample Input
0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1
Sample Output
0.7071
No solution
0.7554
题目链接:
分析:
非线性方程求根问题, LRJ《算法入门经典》p150有类似的问题。 要求的跟是0~1之间, 而且这个方程是单调递减的,所以可以用二分来求根。
实在不行的话你也可以这样做,用高中求导的方法进行求解,对函数进行求一阶导数,易得出该函数是个单调的函数,所以就可以采用二分求解!
二分怎么做呢,我们看,如果是直接去找点,或许问题会变得非常复杂,我们可以换种思路考虑,这个单调函数一定会在某一点使得f(x)=0,所以
我们可以去找f(l)*f(mid)的值大于0还是小于0的操作,这是研究单调函数常用的方法,于是这题就变得非常简单了
二分判断条件为f(l)*f(mid)>0?l=mid:r=mid;
然后你就能AC了?不,此题还有坑点啊!
此题坑点在循环输入,还有就是精度问题,注意这两点就AC了!
下面给出AC代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 const double eps=1e-8;
4 double p,q,r,s,t,u;
5 double gcd(double x)
6 {
7 return p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*pow(x,2)+u;
8 }
9 int main()
10 {
11 while(scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u)!=EOF)
12 {
13 double l=0.0,r=1.0,mid;
14 if(gcd(l)*gcd(r)>0)
15 {
16 printf("No solutionn");
17 continue;
18 }
19 while(l+eps<=r)
20 {
21 mid=(l+r)/2;
22 if(gcd(l)*gcd(mid)>0)
23 l=mid;
24 else r=mid;
25 }
26 printf("%.4lfn",mid);
27 }
28 return 0;
29 }
- Javascript: 世纪机器语言?
- OpenDaylight与Mininet应用实战之基本环境搭建一
- 永恒不变的魅力
- MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
- OpenDaylight与Mininet应用实战之流表操作三
- 天啊,这个围笑代表什么?麻省理工的AI比你更懂 | 论文+Demo
- elixir:灵丹妙药?or 徒有其名?
- OpenDaylight与Mininet应用实战之三层转发机制四
- 程序员效率指南
- 【每日播报】OpenDaylight与Mininet应用实战之复杂网络验证(五)
- Docker hackathon, teamspark 及团队协作软件设计上的思考
- 应用开发中的网络安全
- 力作|phpcms_v9.6.1 任意文件下载漏洞
- 从开发者的角度看:打包和部署
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- NuGet 如何设置图标
- VBA解析VBAProject 00
- Echarts图表宽度变成100px,让图表宽度随着父元素自动适应,Vue实时监听宽度的变化,这可能是史上最好的解决方案!
- Vim 基础和常用命令整理
- TinyMCE 优化百度地图 bdmap 插件
- 更新!万字长文带你拿下九大排序的原理、Java 实现以及算法分析
- mysql 同一张表查询 left join
- uni-app运行到浏览器跨域H5页面的跨域问题解决方案
- 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)
- 树状数据库表查询2次以上(自连接、内连接、别名)方法
- 网页背景H5视频自动播放---PC端、移动端兼容问题完美解决方案(IOS、安卓、微信端)
- 【STM32F407】第11章 RL-TCPnet V7.X之TCP服务器
- 如何解决nodejs中cpu密集型的任务
- 博客园主题1【备份】
- 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)