zoukankan      html  css  js  c++  java
  • HDU 2899 Strange fuction(牛顿迭代)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 9333    Accepted Submission(s): 6352


    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
     
    Author
    Redow
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  2199 2289 2298 2141 3400 
     
    被eps卡好蛋疼啊。。
    首先求函数的最大最小值问题可以转化为导数的零点的问题
    然后用牛顿迭代求导数零点就行了
    eps不能设的太小
     
     
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const double eps = 1e-9;
    double y;
    double fdd(double x) {
        return 252 * pow(x, 5) + 240 * pow(x, 4) + 42 * x + 10;
    }
    double fd(double x) {
        return 42 * pow(x, 6) + 48 * pow(x, 5) + 21 * pow(x, 2) + 10 * x - y;
    }
    double f(double x) {
        return 6 * pow(x, 7) + 8 * pow(x, 6) + 7 * pow(x, 3) + 5 * pow(x, 2) - y  * x;
    }
    double Newton(double x) {
        while(fabs(fd(x)) > eps) 
            x = x - fd(x) / fdd(x);
        return x;
    }
    int main() {
        int QwQ;
        scanf("%d", &QwQ);
        while(QwQ--) {
            scanf("%lf", &y);
            double ans = 1e15, pos;
            for(int i = 0; i <= 100; i++) {
                double anspos = Newton(i);
                if(anspos >= 0 && anspos <= 100) 
                    ans = min(ans, f(anspos));
            } 
            printf("%.4lf
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    [2020.12.5周六]Boruvka
    [2020.12.4周五] 圆上对称博弈
    [2020.12.3周四]最长上升子序列
    置顶~ 未来半年内训练计划
    cf1473d
    cf1474D
    寒假复健第一天 cf1475D
    来啦来啦,寒假复健第一题cf1475g
    12.1加训总结 2019南京
    12.7-12.13训练计划
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9149347.html
Copyright © 2011-2022 走看看