当前位置: 首页 > news >正文

P1883 【模板】三分 | 函数

题目描述

给定 n 个二次函数 f1​(x),f2​(x),…,fn​(x)(均形如 ax2+bx+c),设 F(x)=max{f1​(x),f2​(x),...,fn​(x)},求 F(x) 在区间 [0,1000] 上的最小值。

输入格式

输入第一行为正整数 T,表示有 T 组数据。

每组数据第一行一个正整数 n,接着 n 行,每行 3 个整数 a,b,c,用来表示每个二次函数的 3 个系数,注意二次函数有可能退化成一次。

输出格式

每组数据输出一行,表示 F(x) 的在区间 [0,1000] 上的最小值。答案精确到小数点后四位,四舍五入。

说明/提示

对于 50% 的数据,n≤100。

对于 100% 的数据,T<10, n≤104,0≤a≤100,∣b∣≤5×103,∣c∣≤5×103。

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100005;
int a[MAXN], b[MAXN], c[MAXN];
int n;

double F(double x) {
    double res = -1e18;
    for (int i = 0; i < n; i++) {
        res = max(res, a[i]*x*x + b[i]*x + c[i]);
    }
    return res;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i] >> b[i] >> c[i];
        }

        double l = 0.0, r = 1000.0;
        while (r - l > 1e-9) {  // 保证精度
            double lmid = l + (r - l) / 3;
            double rmid = r - (r - l) / 3;
            if (F(lmid) < F(rmid))
                r = rmid;
            else
                l = lmid;
        }

        printf("%.4f\n", F(l));
    }

    return 0;
}

F(x) 表示:在每个 x 位置上,取所有函数中值最大的那一个

由于 a≥0,每个函数是凹的。它们的最大值组成的函数F(x)还是凹的

F(x) 先下降、后上升

三分法的思路是:

  • 找出两个三分点 lmid, rmid

  • 比较 F(lmid) 和 F(rmid)

  • 因为 F(x) 是凹函数(先降后升),

    • 如果 F(lmid) < F(rmid),说明最小值在左侧

    • 否则在右侧

  • 不断缩小区间 lr

直到区间极小(小于 10^-9),我们认为找到了极小值点。

由于浮点数存在精度问题,当进行多次计算时,会有非常微小的误差。如果使用 l <= r,在接近正确解的时候,lr 可能永远不完全相等,所以会陷入死循环。

  • 精度终止条件:使用 r - l > epsilon(比如 1e-9)可以确保在精度范围内停止,不依赖于 lr 是否恰好相等。只要它们之间的差距小到几乎无法再缩小,就认为已经找到了最优解

相关文章:

  • 网站建网站建设企业电话seo代码优化包括哪些
  • 厦门英文网站建设seo全网优化推广
  • 义乌正规自适应网站建设首选优秀营销案例分享
  • 用php怎么做网站怎么建立网站平台
  • 网站页面设计招聘推广策略可以分为哪三种
  • 网站设计的一般步骤是什么?营销软文范例大全
  • 【MATLAB定位例程】TDOA(到达时间差)的chan-tylor,三维环境,附完整代码
  • 蓝桥杯刷题笔记
  • # 利用OpenCV和Dlib实现疲劳检测:守护安全与专注
  • SMT加工贴片核心工艺解析
  • 我的二周年创作纪念日
  • 2024版idea使用Lombok时报找不到符号
  • Apache 配置负载均衡详解(含配置示例)
  • P1125 [NOIP 2008 提高组] 笨小猴
  • SQL Server常见问题的分类解析(一)
  • Hibernate里的对象不同状态和Session的核心方法
  • 2025年3月通信科技周报(3.24-3.30):AI赋能通信基础设施升级
  • vue watch和 watchEffect
  • Linux中C++ gdb调试命令
  • 【多线程】CAS机制
  • 《基于 C++ 的怪物掉落武器功能开发》
  • 19.go日志包log
  • 拍摄的婚庆视频有些DAT的视频文件打不开怎么办
  • JavaScript学习21-事件类型之键盘事件
  • 【STM32】Flash详解
  • Mysql的备份还原