杭电 2899 数学 牛顿迭代法
2012-03-04 16:50
183 查看
第一次写这样的题目,写出来很有成就感啊。用二分法和牛顿迭代法都可以解决。题目:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 739 Accepted Submission(s): 566
Problem Description
Now, here is a fuction:
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
Output
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.
Sample Input
Sample Output
牛顿迭代法ac代码:
二分法ac代码:
Strange fuction
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 739 Accepted Submission(s): 566
Problem Description
Now, here is a fuction:
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
Output
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.
Sample Input
2 100 200
Sample Output
-74.4291 -178.8534
牛顿迭代法ac代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; double ee=1e-10; double y; double mi(double s,int x){ double ss=1.00000000; for(int i=1;i<=x;++i) ss*=s; return ss; } double f(double x){ return 42*mi(x,6)+48*mi(x,5)+21*mi(x,2)+10*x-y; } double ff(double x){ return 252*mi(x,5)+240*mi(x,4)+42*x+10; } double solve(double x){ return 6*mi(x,7)+8*mi(x,6)+7*mi(x,3)+5*mi(x,2)-y*x; } int main(){ int numcase; scanf("%d",&numcase); while(numcase--){ scanf("%lf",&y); double fx=f(0.00000000); double fy=ff(0.00000000); double fz=0.00000000-fx/fy; double ans=0.00000000; while(abs(fz-ans)>ee){ ans=fz; fx=f(fz); fy=ff(fz); fz=fz-fx/fy; } double newans=solve(ans); printf("%.4lf\n",newans); } return 0; }
二分法ac代码:
#include <iostream> #include <cstdio> using namespace std; double ee=1e-10; double mi(double s,int x){ double ss=1.00000000; for(int i=1;i<=x;++i) ss*=s; return ss; } double binary_search(double x){ double ll=0.00000000,rr=100.00000000; double mid; double mm,nn; while(rr-ll>ee){ mid=(ll+rr)/2.0; mm=42*mi(mid,6)+48*mi(mid,5)+21*mi(mid,2)+10*mid; nn=mm-x; if(nn>ee) rr=mid; else if(nn<ee) ll=mid; else if(nn==ee) break; } return mid; } double solve(double x,double ss){ return 6*mi(x,7)+8*mi(x,6)+7*mi(x,3)+5*mi(x,2)-ss*x; } int main(){ int numcase; double y; scanf("%d",&numcase); while(numcase--){ scanf("%lf",&y); double ans=binary_search(y); double mmax=0.0; if(mmax>solve(100.000,y)) mmax=solve(100.000,y); if(mmax>solve(ans,y)) mmax=solve(ans,y); printf("%.4lf\n",mmax); } return 0; }
相关文章推荐
- 杭电ACM OJ 1006 Tick and Tick 厌倦时钟 其实就是简单的数学题
- Math——HDUOJ 1290 - 献给杭电五十周年校庆的礼物(数学公式总结)
- 【水题+数学推导】杭电 hdu 2018 母牛的故事
- 杭电--2175--汉诺塔IX--数学题
- 【杭电oj】1060 - Leftmost Digit(数学好题)
- hdu 2899 (数学+二分)
- 数学 HDU 1290 献给杭电五十周年校庆的礼物
- HDOJ, 杭电1032, The 3n+1 problem. POJ, 北大OJ,1207....数学题。。又一发
- 杭电2086数学题
- 杭电OJ(HDOJ)1018题:求n的阶乘位数(数学公式)
- 杭电ACM课件学习 简单数学题
- 【杭电-oj】-5053-立方和(数学方法)
- HDU--杭电--2899--Strange fuction--二分
- hdoj.1290 献给杭电五十周年校庆的礼物【数学几何】 2015/08/05
- hdu 2899 Strange fuction(二分+数学)
- 【2016杭电女生赛1004】【枚举 数学解方程】Clock 下一时刻时针分针恰成角度
- 数学建模三 单变量优化和求解 牛顿迭代法
- 【杭电-oj】 2003 - 求绝对值(数学fabs绝对值*里面必须为浮点型)
- 杭电ACM1220——Cube~~简单的数学题
- HDU-2899(简单数学问题+二分查找)