http://ac.nbutoj.com/Problem/view.xhtml?id=1346
-
[1346] 虎追兔,兔躲虎
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
老虎想和兔子玩, 所以老虎一直追着兔子, 兔子觉着老虎很笨, 就一直躲着老虎.
有天, 兔子躲烦了. 停下来对老虎说 : "我最近对一个问题感到十分的困惑, 如果你能帮我解决我的问题, 我就不躲着你了."
有一个方程, 如下所示.
其中0 < q, s, t, u< 500 且 r , v < 0.
兔子想知道该方程在 [0, 1] 区间内的所有解.
老虎一下子就不知道该怎么办了. - 输入
-
本题有多组输入, 对于每组数据, 在一行内包含q, r, s, t, u, v
- 输出
-
对于每一组输出, 从小到大输出方程的所有解, 用空格分隔, 保留3位小数. 否则输出 -1
- 样例输入
-
1 -1 1 1 1 -1
- 样例输出
-
0.522
- 提示
-
无
- 来源
-
monkeyde17
思路 :
这个题 没有看出来到底是怎样的 只是感觉应该考的是二分法 所以就猜着试了下 把他当做单调递增函数去做
#include<stdio.h> #include<math.h> int q,r,s,t,u,v; double ans(double x) { return q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u*x+v; } int main() { double mid,x,start,end; while(scanf("%d %d %d %d %d %d",&q,&r,&s,&t,&u,&v)!=EOF) { x=-1; start=0;end=1; while(end-start>0.000000001)//注意这里少了一个零就会错 要很小才行 有时候对精确度把握真心不好说 就记住这个吧 以后都用这个精确度 { mid=(start+end)/2; double t=ans(mid); if(t<0.00001&&t>-0.000001) { x=mid; break; } else if(t<0) { start=mid; } else end=mid; } if(x!=-1) printf("%.3lf\n",x); else printf("-1\n"); } return 0; }