P1883 函数

题目链接

P1883 函数

思路

举例

题目中的 F ( x ) F(x) F(x) 看起来很复杂,但由于每个 f ( x ) f(x) f(x) 的二次项系数 a a a 都不是负数,故 F ( x ) F(x) F(x) 是一个单谷函数。直接说出结论可能有些令人难以接受,不妨举出两个例子。

第一个例子是 a a a 大于0的情况,即 f 1 ( x ) = x 2 , f 2 ( x ) = x 2 − 2 x + 10 f_1(x)=x^2,f_2(x)=x^2-2x+10 f1(x)=x2,f2(x)=x22x+10 ,图像如下:
在这里插入图片描述

显然,当 x ≥ 5 x≥5 x5 时, f 1 ( x ) ≥ f 2 ( x ) f_1(x)≥f_2(x) f1(x)f2(x) ;当 0 ≤ x < 5 0≤x<5 0x<5 时, f 1 ( x ) < f 2 ( x ) f_1(x)<f_2(x) f1(x)<f2(x) 。所以在区间 [ 0 , 5 ) [0, 5) [0,5) 上, F ( x ) F(x) F(x) f 2 ( x ) f_2(x) f2(x) 的函数值;所以在区间 [ 5 , 1000 ] [5, 1000] [5,1000] 上, F ( x ) F(x) F(x) f 1 ( x ) f_1(x) f1(x) 的函数值。显然 F ( x ) F(x) F(x) 的图像是一个单谷函数,有最小值。

第二个例子是 a a a 等于0的情况,即 f 1 ( x ) = x 2 , f 2 ( x ) = x + 2 f_1(x)=x^2,f_2(x)=x+2 f1(x)=x2,f2(x)=x+2 ,图像如下:
在这里插入图片描述

显然,当 x ≥ 2 x≥2 x2 时, f 1 ( x ) ≥ f 2 ( x ) f_1(x)≥f_2(x) f1(x)f2(x) ;当 0 ≤ x < 2 0≤x<2 0x<2 时, f 1 ( x ) < f 2 ( x ) f_1(x)<f_2(x) f1(x)<f2(x) 。所以在区间 [ 0 , 2 ) [0, 2) [0,2) 上, F ( x ) F(x) F(x) f 2 ( x ) f_2(x) f2(x) 的函数值;所以在区间 [ 2 , 1000 ] [2, 1000] [2,1000] 上, F ( x ) F(x) F(x) f 1 ( x ) f_1(x) f1(x) 的函数值。显然 F ( x ) F(x) F(x) 的图像是一个单谷函数,有最小值。

通过以上两个例子,可推得只要 a ≥ 0 a≥0 a0 那么无论增加多少个二次函数(或者退化为一次函数),最终形成的函数 F ( x ) F(x) F(x) 势必是一个单谷函数,有最小值,故想到使用三分法求最小值。

三分法

对于初始的区间,左端点 l e f t left left 为0,右端点 r i g h t right right 为1000,左三等分点 m i d L midL midL 和右三等分点 m i d R midR midR 在循环中更新。

如果 F ( m i d L ) > F ( m i d R ) F(midL) > F(midR) F(midL)>F(midR) ,说明函数的最小值点在区间 [ m i d L , r i g h t ] [midL, right] [midL,right] ,故更新 l e f t left left m i d L midL midL ;否则说明函数的最小值点在区间 [ l e f t , m i d R ] [left, midR] [left,midR] ,故更新 r i g h t right right m i d R midR midR 。如果不理解三分的更新子区间,请参考算法——三分法。

当区间长度小于指定精度 p r e c i s i o n precision precision 时,退出循环,输出结果。详见代码。

使用inline

题解中使用了关键字 i n l i n e inline inline ,只要一个函数被 i n l i n e inline inline 修饰(这种函数被称为内联函数),那么使用该函数的地方会粘贴函数体里面的代码,从而加快函数的调用,并且减少栈空间的浪费。求 f 1 ( x ) , f 2 ( x ) , . . . , f n ( x ) f_1(x), f_2(x),...,f_n(x) f1(x),f2(x),...,fn(x) 的函数值被使用了很多次,故使用内联函数加快执行速度。

代码

#include <iostream>
#include <cstdio>
using std::cin, std::cout;
const int N = 1e4 + 5;						// 数组长度
const double precision = 1e-9;				// 精度
/*n是二次函数的个数		a[]保存二次项系数b[]保存一次项系数		c[]保存常数项
*/
int n, a[N], b[N], c[N];
inline double func(double x, int num) {		// 求第num个二次函数在x处的取值return a[num] * x * x + b[num] * x + c[num];
}
double getFuncMax(double x) {				// 求F(x)在x处的取值double res = func(x, 0);for (int i = 1; i < n; i++) {double temp = func(x, i);res = res > temp ? res : temp;}return res;
}
void process() {							// 每个测试案例的解决方案cin >> n;for (int i = 0; i < n; i++) {cin >> a[i] >> b[i] >> c[i];}double left = 0.0, right = 1000.0, midL, midR;while (right - left > precision) {midL = left + (right - left) / 3.0;midR = right - (right - left) / 3.0;if (getFuncMax(midL) > getFuncMax(midR)) {left = midL;} else {right = midR;}}printf("%.4lf\n", getFuncMax(left));	// left是F(x)的最小值点
}
int main() {int t;									// 测试案例的个数cin >> t;while (t-- > 0) {process();}return 0;
}

说明

本文的两个函数图像由 G e o G e b r a GeoGebra GeoGebra 生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294173.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文档 - - - Docsify文档创建

目录 1. Docsify 介绍2. 创建 Docsify 项目2.1 安装 Node.js2.1 安装 docsfiy-cli2.3 初始化项目2.4 运行项目2.5 使用 Python 运行项目&#xff08;扩展&#xff0c;不推荐有bug&#xff09; 3. 配置 Docsify 项目3.1 修改等待加载文字3.2 添加网站 ico 图标3.3 创建新页面写文…

编译原理----算符优先级的分析(自底向上)

自底向上分析的分类如下所示&#xff1a; 算符优先分析 算符优先分析只规定算符之间的优先关系&#xff0c;也就是只考虑终结符之间的优先关系。 &#xff08;一&#xff09;若有文法G&#xff0c;如果G没有形如A->..BC..的产生式&#xff0c;其中B和C为非终结符&#xff…

Milvus数据一致性介绍及选择方法

1、Milvus 时钟机制 Milvus 通过时间戳水印来保障读链路的一致性&#xff0c;如下图所示&#xff0c;在往消息队列插入数据时&#xff0c; Milvus 不光会为这些插入记录打上时间戳&#xff0c;还会不间断地插入同步时间戳&#xff0c;以图中同步时间戳 syncTs1 为例&#xff0…

CGAL的2D和曲面插值函数

了解函数使用&#xff0c;对数学原理不一定要懂&#xff0c; 这个软件包实现了各种邻居坐标计算函数以及用于散乱数据插值的不同方法。 在2D欧几里得空间中&#xff0c;自然和常规邻居坐标的计算在“自然邻居坐标”一节中描述。 在表面上的坐标和邻居计算在“表面自然邻居坐标和…

webpack学习-7.创建库

webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm&#xff0c;而且还要在项目中使用到它&#xff0c;支持各种…

Nginx快速入门:安装目录结构详解及核心配置解读(二)

0. 引言 上节我们讲解了nginx的应用场景和安装&#xff0c;本节继续针对nginx的各个目录文件进行讲解&#xff0c;让大家更加深入的认识nginx。并通过一个实操案例&#xff0c;带大家来实际认知nginx的核心配置 1. nginx安装目录结构 首先nginx的默认安装目录为&#xff1a;…

相对路径、绝对路径和特殊路径符

目录 相对路径概念&#xff1a; 绝对路径概念&#xff1a; 特殊路径符.概念作用 .\.概念作用 ~概念作用 总结 相对路径 概念&#xff1a; 文件/文件夹相对于当前所处的工作目录的路径。如下图&#xff1a; 如何描述用户工作目录下的 hello2.txt 的相对路径呢&#xff1f; 由…

电脑完全重装教程——原版系统镜像安装

注意事项 本教程会清除所有个人文件 请谨慎操作 请谨慎操作 请谨慎操作 前言 本教程是以系统安装U盘为介质进行系统重装操作&#xff0c;照着流程操作会清除整个硬盘里的文件&#xff0c;请考虑清楚哦&#xff5e; 有些小伙伴可能随便在百度上找个WinPE作为启动盘就直接…

c++11特新:弱引用智能指针

弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手&#xff0c;它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c;不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减少引用计数…

docker部署mysql主主备份 haproxy代理(swarm)

docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; docker部署mysql主主备份 docker部署mysql主主备份&#xff08;keepalived&#xff09;跨主机自动切换 docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; 1. 环境准备 主机IPnode119…

CSS3多列分页属性

CSS3多列 Firefox浏览器支持该属性的形式是-moz-column-count&#xff0c;而基于Webkit的浏览器&#xff0c;例如Safari和Chrome&#xff0c;支持该属性的形式是-webkit-column-count column-count&#xff1a;该属性定义多列文本流中的栏数 语法&#xff1a;column-count:int…

UG阵列特征

阵列特征&#xff1a;将一个或多个特征&#xff0c;沿线性方向阵列复制图形 实体建模时建议草图尽可能简单&#xff0c;能特征阵列的别草图阵列 阵列特征命令在如下位置&#xff1a;菜单-插入-关联复制-阵列特征 当我们只需要选中的特征沿着一个或两个方向进行阵列的时候&…