UVA 10341- Solve It(二分+精度求解方程值)

Problem F

Solve It

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Solve the equation:

p*e-xq*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: pqrst 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

题意:给出p,q,r,s,t,u的值,根据方程式求出方程的近似解。

思路:因为方程是递减的,对于两个端点,如果f(0)<0或者是f(1)>0 ,则说明方程无解。取两个端点的中点mid 如果f(0)*f(mid)<0  ,说明方程的解在[0,mid]中,否则解在[mid,1]中,这样不断进行下去,区间会收敛于一点,即为最后的近似解

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
#define eps 1e-8
double p,q,r,s,t,u;
double Solve (double x)
{
    return p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;//exp(x) 指的是e的x次方。
}
int main()
{
    double left,right,mid;
    while(~scanf("%lf %lf %lf %lf %lf %lf",&p,&q,&r,&s,&t,&u)) {
        if(Solve(0)<0||Solve(1)>0)
            printf("No solution\n");
        else {
            left=0;
            right=1;
            while((right-left)>=eps) {
                mid=(left+right)/2;
                if(Solve(mid)<0)
                    right=mid;
                else
                    left=mid;
            }
            printf("%.4lf\n",mid);
        }
    }
    return 0;
}
时间: 2024-10-22 07:56:40

UVA 10341- Solve It(二分+精度求解方程值)的相关文章

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB 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 te

UVA - 10341 - Solve It (二分求解)

思路:给你一个公式,求零点,从题目条件可以看出,此函数式是递减的,所以只要从两头往中间二分答案即可,注意精度问题,因为要精确到小数点后4位,<1e-6居然还WA,<1e-9才过,所以说尽量使精度高点 这里e的n次方可以用exp(n)表示,也可以用pow(M_E, n)表示 以下是math.h中定义的一些常量: /* Definitions of useful mathematical constants * M_E - e * M_LOG2E - log2(e) * M_LOG10E - lo

uva10341 - solve it (二分查找)

题目:uva10341-solve it 题目大意:求解给定的方程式解题思路:因为这个方程式在给定的x的范围内是单调递减的,所以可以用二分查找来尝试x的值.这里的 x是要求保留4小数,所以当区间缩小到一定的范围,这时候就是x的解.无解的情况只可能出现在x范围的两端. 代码: #include <stdio.h> #include <stdlib.h> #include <math.h> double p, q, r, s, t, u; const double eps

HDU Strange fuction(二分+精度控制)

相当于y是个常数求 F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)这个函数的最小值,令F' = 0,得出x,y的方程,用二分法解方程得x0(易证得x0>=0 && x0<=100),则F'(x0) = 0,由F'' 在[0-100]上恒大于0,所以F'在[0-100]上单增,所以F'(x)<0(x<x0),F'(x)>0(x>x0),所以F(x)在x=x0处取得最小值,所以本题主要就是二

用弦截法求解方程的根

//弦截法求解方程的根 //要求:输入左右两个端点x值 //结果:在一定精度范围内求解出方程的根 //难点:1)推导出x处的横坐标的求解公式 2)迭代掉原来的左端点或者右端点 #include "pch.h" #include <iostream> #include <cmath> #include <iomanip> using namespace std; double f(double x); double xpoint(double x1,

uva 1356 - Bridge(积分+二分)

题目链接:uva 1356 - Bridge 题目大意:在一座长度为B的桥上建若干个塔,塔的间距不能超过D,塔的高度为H,塔之间的绳索形成全等的抛物线.绳索的总长度为L.问在建最少塔的情况下,绳索的最下段离地面的高度. 解题思路:贪心的思想求出最少情况下建立的塔数. 二分高度,然后用积分求出两塔之间绳索的长度. C++ 积分 #include <cstdio> #include <cstring> #include <cmath> #include <algori

uva 12627 - Erratic Expansion(递归求解)

递归的边界条件写的多了--没必要写呢么多的.. 不明白可共同探讨~ #include<cstdio> #include<iostream> #include<cmath> using namespace std; long long dp(int kk,int pos) { int n=kk;int temp=(int)pow(2,n); // printf("%d %d\n",kk,pos); if(kk==0&&pos==1) r

poj 1064 Cable master ,二分 精度!!!

给出n根绳子,求把它们切割成K条等长的绳子的最大长度是多少? 二分 用 for(int i=0; i<100; ++i) 代替   while(r-l>eps) 循环100次精度能达到1e-30,基本上能一般题目的精度要求. 而 浮点数二分区间的话容易产生精度缺失导致死循环. #include<cstdio> double L[10000 + 10]; int n, k; int ok(double x) { int cnt = 0; for(int i=0; i<n; ++

遗传算法的简单应用-求解方程

上篇初识遗传算法讲述了遗传算法的基本思想,这篇博客就用遗传算法求解方程. 具体的如下: 求解方程 -x^3+7*x+13=0 在[3,4]区间的解,解精确到0.001,交叉概率0.7 变异概率0.01,迭代次数为100,字符编码长度为10(二进制编码) 首先简单的分析一下: 1.编码与解码 题目要求的是采用二进制的编码方式来实现,既然已经编码了,自然就需要解码,给定的10 位二进制编码表示的区间范围就是0~1023,题目的区间是[3,4]很自然的就能想到10位二进 制编码中的0表示是就是[3,4