-
http://acm.nbut.cn/Problem/view.xhtml?id=1377 飞机票一张
-
[1377] I Hate Math
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
There is a function: f(x) = 2x^5 + 3x^4 + 4x^3 + 5x^2 - kx. In short, your task is very simple: every time give you an integer k, calculate the minimun f(t), while 0<=t<=100.
- 输入
-
For each case there is an integer k, k can be very large but I promise it is no more than the range of int.
- 输出
-
For each case, print the minimun number for a given function, keep three decimal points please.
- 样例输入
-
0 10 100
- 样例输出
-
0.000 -3.000 -97.122
- 提示
-
无
- 来源
-
小白菜
输出 f(x)的最小解
/* ]):①f’(0)>=0,那么导数恒不小于零,f(x)单调递增,所以f(x)在x=0处取得最小值。 ②f’(100)<=0,那么导数恒不大于零,f(x)单调递减,所以f(x)在x=100处取得最小值。 ③除①②种情况外,f’(x) = 0的解落在给定的定义域内,并且由f’(x)得f(x)先递减后递增, 所以要先用二分法求得f’(x)=0的解,得到x=T,带回原函数即f(T)即为所求的最小值 */ #include<stdio.h> #include<math.h> double get(double x,double k)//导数 { return 10*x*x*x*x+12*x*x*x+12*x*x+10*x-k; } double getans(double x,double k) { return 2*x*x*x*x*x+3*x*x*x*x+4*x*x*x+5*x*x-k*x; } double erfen(double k) { double start=0,end=100,mid; double q; while(end-start>0.0000001) { mid=(end+start)/2.0; q=get(mid,k); if(q<0.0000001) { start=mid;//+0.00001; } else if(q>0.00000001) { end=mid;//-0.00001; } else if(fabs(q)<=0.0000001) return mid; } return mid; } int main() { double k,f1,f2; while(scanf("%lf",&k)!=EOF) { f1=get(0,k); f2=get(100,k); if(f1>=0&&f2>=0) { printf("%.3lf\n",getans(0,k)); } else if(f1<=0&&f2<=0) { printf("%.3lf\n",getans(100,k)); } else { double pos=erfen(k); //printf("pos=%lf\n",pos); printf("%.3lf\n",getans(pos,k)); } } return 0; }
教训:一开始 没有看到x的范围 审题有错 自己读题老是读不完整 这个缺点很致命另外发现自己的代码能力很弱 有空要多写写水题 练练代码能力在写二分法的时候都写错了 造成了错误end-start>0.0000001 这个地方不能加fabs 因为可能后来start比end大 这时候也要退出
mid=(end+start)/2.0; 我居然一开始用的减 阿弥陀佛
start=mid;//+0.00001; 不要加上那个偏移 因为可能把正确答案跳过去
另外在网上看到有人说浮点型是没有办法进行二分法的 这样的观点应该是不正确的吧
-
另外 一定要在最后加上一个return mid;
-
因为也许根本找不到 或者什么原因 很接近 但是没有找到 就把mid返回
nbut [1377] I Hate Math 输出f(x) = 2x^5 + 3x^4 + 4x^3 + 5x^2 - kx的最小解
最新推荐文章于 2019-02-10 15:58:02 发布