链接:https://www.nowcoder.com/acm/contest/115/F
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?
告诉你Y的值,你能找出方程在0~100之间的解吗?
输入描述:
第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y
输出描述:
一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
示例1
输入
2 1 20180421
输出
-1 9.9993
函数是递增的
二分的模板题,每次把区间一分为二,就是mid=(l+r)*1.0/2;然后算f(mid),如果刚好等于Y就输出,如果小于就取右边的区间继续算,否则取左边的
区间继续算。
#include<stdio.h> #include<string.h> double Y; int t; double f(double x) { return 2018*x*x*x*x + 21*x + 5*x*x*x + 5*x*x +14;//求导发现是递增的 } double find(int a,int b) { double l=a; double r=b; if(f(0)>Y||f(100)<Y)//判断是否 无解 return -1; while(r-l>0.00001)//误差小于0.0001,我多加一个0没多大影响,还更精确 { double mid=(l+r)/2; if(f(mid)<Y) l=mid; else if(f(mid)>Y) r=mid; else return mid; } return l; } int main() { scanf("%lld",&t); while(t--) { scanf("%lfd",&Y); double ans=find(0,100); if(ans==-1) printf("%.0f ",ans); else printf("%.4f ",ans); } return 0; }