哈理工OJ 1926 函数式计算

函数式计算
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 247(54 users) Total Accepted: 62(50 users) Rating:  Special Judge: No
Description
小辉是一个游戏天才,但是数学不太好,一天他遇到一个难题,请你帮他解决。这道题是这样,给你一个函数式 4*x^4+3*x^3+2*x^2+x=y 然后给出y,求x的值。
Input

有多组测试数据,输入的第一行是一个整数T(T<=1000)代表着测试数据的数量,接下来是T组测试数据。 
接下来T行,每行一组输入整数y,0<=y<=100

Output

输出结果x(保留4位小数),如果答案有一个,则输出答案并换行;如果有多个,按从大到小的顺序输出,每个答案中间用空格隔开,最后换行。

Sample Input
1
1
Sample Output
0.3971 -0.8764
Source
新生练习赛(2013.11.9)
Author
hrbust
Submit Statistic Discuss Sharedcodes


典型的二分题目、但是这里x的范围没有给定、需要我们自行琢磨、另外其中的解也需要我们自己琢磨、、、因为我们这里x不可能大于y所以我们定y为区间边界、

通过样例中y=1的时候我们求解发现,从0~y的区间内的x解只有一个、所以我们这里就想到负值x解、相反考虑了一波、对应就知道这个解怎么求了。

正x解要在前边输出,负x解要在后边输出、

这里注意有一个小坑:当y=0的时候,需要特别照顾一下输出。这里直接上AC代码:

#include<stdio.h>
#include<string.h>
using namespace std;
double f(double x)
{
    return 4*x*x*x*x+3*x*x*x+2*x*x+x;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int y;
        scanf("%d",&y);
        if(y==0)
        {
            printf("0.0000 -0.6058\n");
            continue;
        }
        double l=0;
        double r=y;
        double mid;
        while(r-l>=1e-5)
        {
            mid=(l+r)*1.0/2;
            if(f(mid)>y)
            {
                r=mid;
            }
            else
            l=mid;
        }
        printf("%.4lf",l);
        l=-y;
        r=0;
        while(r-l>=1e-5)
        {
            mid=(l+r)*1.0/2;
            if(f(mid)>y)
            {
                l=mid;
            }
            else
            r=mid;
        }
        printf(" %.4lf\n",l);
    }
}






你可能感兴趣的:(哈理工oj,1926)