UVA 10341 (二分查找+精度)

题意:

给你一个关于x的方程,给出变量的值,求出x;

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 terminated by an EOF. Each test case consists of 6 integers in a single line:p,q,r,
s,t and u (where0 <= 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 ofx, 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,1]上单调,求导f‘(x)=-p*e(-x)+q*cos(x)-r*sin(x)+s/(cos(x)*cos(x))+2t*x

x      , [0,1]

e(-x) ,[1/e,1]

cos(x),[0,pi]

sin(x) , [0,pi]

p,r>0 q,s,t<0, f‘(x)的每一项都是负的,

f(x)单调递减,故二分枚举,当f(left) *f(right)>0,无解

代码:

#include <iostream>// 二分查找,
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn=105;
const int base=1000;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1.0);
double p,q,r,s,t,u;
double fun(double x)
{
    return p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*pow(x,2)+u;
}
int main()
{
    int n,m,i,j;
    while(~scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u))
    {
        int sum=0;
        double left=0, right=1, mid;
        bool flag=false;
        if(fun(left)*fun(right)>0)  //在同一侧,无解
        {
            printf("No solution\n");
            continue;
        }
        while(right-left>eps)      //二分逼近
        {
            mid=(left+right)/2;
            if(fun(mid)*fun(left)>0) left=mid;
            else right=mid;
        }
        printf("%.4f\n",mid);
    }
    return 0;
}
时间: 2024-09-30 19:20:22

UVA 10341 (二分查找+精度)的相关文章

POJ 1064 Cable master(二分查找+精度)(神坑题)

POJ 1064 Cable master 一开始把 int C(double x) 里面写成了  int C(int x) ,莫名奇妙竟然过了样例,交了以后直接就wa. 后来发现又把二分查找的判断条件写错了,wa了n次,当 c(mid)<=k时,令ub=mid,这个判断是错的,因为要找到最大切割长度,当满足这个条件时,可能已经不是最大长度了,此时还继续缩小区间,自然就wa了,(从大到小递减,第一次满足这个条件的值,就是最大的值),正确的判断是当 c(mid)<k时,令ub=mid,这样循环1

UVa 10341 (二分求根) Solve It

很水的一道题,因为你发现这个函数是单调递减的,所以二分法求出函数的根即可. 1 #include <cstdio> 2 #include <cmath> 3 //using namespace std; 4 5 const double e = 1e-14; 6 double p, q, r, s, t, u; 7 8 inline double f(double x) 9 { return p*exp(-x) + q*sin(x) + r*cos(x) + s*tan(x) +

uva:10487 - Closest Sums(二分查找)

题目:10487 - Closest Sums 题目大意:给出一组数据,再给出m个查询的数字.要求找到这组数据里的两个数据相加的和最靠近这个查询的数据,输出那两个数据的和. 解题思路:二分查找,这样找到的话,就输出查询的数值,但是要注意找不到的情况:这里最靠近的值不一定是在找不到的时刻的前一次数据,所以要维护最靠近的要查询数的数值. 代码: #include <stdio.h> #include <algorithm> #include <stdlib.h> using

UVa 1152 和为0的4个值(二分查找)

https://vjudge.net/problem/UVA-1152 题意:给定4个n元素集合A,B,C,D,要求分别从中选取一个元素a,b,c,d,使得a+b+c+d=0.问有多少种取法. 思路:直接暴力枚举的话是会超时的.可以选把a+b的值枚举出来存储,c和d的值也一样并排序,这样就可以在c和d中进行二分查找了. 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 const int ma

UVa 10539 (筛素数、二分查找) Almost Prime Numbers

题意: 求正整数L和U之间有多少个整数x满足形如x=pk 这种形式,其中p为素数,k>1 分析: 首先筛出1e6内的素数,枚举每个素数求出1e12内所有满足条件的数,然后排序. 对于L和U,二分查找出小于U和L的最大数的下标,作差即可得到答案. 1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 5 typedef long long LL; 6 7 const int maxn = 10

uva 10763 Foreign Exchange(排序+二分查找)

这道题是我第一次算出来应该用什么复杂度写的题,或许是这一章刚介绍过,500000的数据必须用nlogn,所以我就 想到了二分,它的复杂度是logn,再对n个数据进行遍历,正好是nlogn,前两次TLE了,然后我就对我的做法没信心 了...看到一篇博客上说就应该这种方法,然后我就坚定的改自己的算法去了,哈哈,专注度没有达到五颗星,最多 三颗... 思路: 我用的是结构体保存的,先对每一对序列排序,然后对第二个元素在第一个元素中二分搜索,用到了 lower_bound,upper_bound,注释里

uva 10487 Closest Sums (遍历&amp;二分查找&amp;&amp;双向查找)

题目大意:先给定n个数字,现在要求算出这n个数字的两两之和保存到sum数组,然后在给定m个数,要求找到和每一个数最接近的sum[i]: 挨个计算每个属于其他数之间的sum,然后排序: 查找时有两种方法:二分查找&&双向查找:当然二分查找的效率比后者高了很多,但是都能AC. 提供一条新思路,并不一定非要用二分. 双向查找: #include<stdio.h> #include<algorithm> #include<stdlib.h> using name

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 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 +