• hdu 5105 求函数极值 函数求导/三分法


    http://acm.hdu.edu.cn/showproblem.php?pid=5105

    给定a,b,c,d,l,r,表示有一个函数f(x)=|a∗x3+b∗x2+c∗x+d|(L≤x≤R),求函数最大值。


    考虑极点可能有0~2个。在极值点处函数的单调性会发生变化,所以最大值一定就在区间边界和极值点上。所以求下l,r,极值点的函数大小然后取最大的即可。

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <map>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define RD(x) scanf("%d",&x)
    #define RD2(x,y) scanf("%d%d",&x,&y)
    #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define clr0(x) memset(x,0,sizeof(x))
    #define clr1(x) memset(x,-1,sizeof(x))
    template<class T> T max(T a, T b, T c) {
        return max(a, max(b, c));
    }
    const double pi = acos(-1.0);
    typedef long long LL;
    typedef unsigned long long ULL;
    const int modo = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    const int inf = 0x3fffffff;
    const LL _inf = 1e18;
    const int maxn = 55,maxm = 1<<12;
    const double eps = 1e-9;
    double A,B,C,D,l,r;
    double cal(double x)
    {
        if(l <= x && x <= r)
            return fabs(A*x*x*x + B*x*x + C*x + D);
        return -1;
    }
    double solve(double a,double b,double c)
    {
        if(fabs(a) < eps){
            if(fabs(b) < eps)
                return -1;
            return cal(-c/b);
        }
        double dta = b*b - 4*a*c;
        if(fabs(dta) >= eps){
            dta = sqrt(dta);
            return max(cal((dta - b)/2/a) , cal((-dta - b)/2/a));
        }
        return -1;
    }
    int main()
    {
        while(~scanf("%lf%lf%lf%lf%lf%lf",&A,&B,&C,&D,&l,&r)){
            double ans = max(cal(l),cal(r),solve(A*3,B*2,C));
            printf("%.2lf
    ",ans);
        }
        return 0;
    }

    绝对值的最大值就是函数最大值或者负的最小值的相反数,考虑用三分法,但是依然需要考虑l,r两点,不然会WA,谨记教训!

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <map>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define RD(x) scanf("%d",&x)
    #define RD2(x,y) scanf("%d%d",&x,&y)
    #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define clr0(x) memset(x,0,sizeof(x))
    #define clr1(x) memset(x,-1,sizeof(x))
    template<class T> T max(T a, T b, T c , T d) {
        return max(max(a,d) , max(b, c));
    }
    const double pi = acos(-1.0);
    typedef long long LL;
    typedef unsigned long long ULL;
    const int modo = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    const int inf = 0x3fffffff;
    const LL _inf = 1e18;
    const int maxn = 55,maxm = 1<<12;
    const double eps = 1e-9;
    double a,b,c,d,l,r;
    double cal(double x)
    {
        return a*x*x*x + b*x*x + c*x + d;
    }
    int main()
    {
        while(~scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&l,&r)){
            double _l = l,_r = r;
            while(l + eps < r){
                double mid = (l+r)/2,rr = (mid + r)/2;
                if(cal(rr) < cal(mid))
                    l = mid;
                else
                    r = rr;
            }
            double ans1 = l;
    
            l = _l,r = _r;
            while(l + eps < r){
                double mid = (l+r)/2,rr = (mid + r)/2;
                if(cal(rr) > cal(mid))
                    l = mid;
                else
                    r = rr;
            }
            double ans2 = l;
            printf("%.2lf
    ",max(fabs(cal(_l)),fabs(cal(_r)),fabs(cal(ans1)),fabs(cal(ans2))));
        }
        return 0;
    }
    


  • 相关阅读:
    Scrapy 扩展中间件: 针对特定响应状态码,使用代理重新请求
    Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL
    Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误
    Scrapyd 改进第二步: Web Interface 添加 STOP 和 START 超链接, 一键调用 Scrapyd API
    简单示例理解神闭包
    ejs 模板使用方法
    我使用的开源组件汇总,以备学习使用
    了不起的Node.js--之五 TCP连接
    Windows7下Java运行时环境搭建
    了不起的Node.js--之四
  • 原文地址:https://www.cnblogs.com/zibaohun/p/4106642.html
Copyright © 2020-2023  润新知