[LuoguP1883]函数 三分法

三分法的模板,一直提交,一直WA

结果,今天把精度判断从l-r>=t改成 fabs(F(l)-F(r))>=t ,过了三个点,再将 \(t\) 改成 \(10^{-7}\) 就 \(AC\) 了。。。

这给我一个十分重要的启示:精度问题十分重要!!!

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;
const int MAXN = 10000+5;
int a[MAXN],b[MAXN],c[MAXN],n;

inline double F(double x) {
    double ans=a[1]*x*x+b[1]*x+c[1];
    for(int i=2; i<=n; i++) ans = max(ans ,a[i]*x*x+b[i]*x+c[i]);
    return ans;
}

int main() {
    int T;
    cin >> T;
    while(T--) {

        cin >> n;
        for(int i=1; i<=n; i++) cin >> a[i] >> b[i] >> c[i];

        double l=0,r=1000,t=1e-7;
        while(fabs(F(l)-F(r))>t) {
            double p=(2*l+r)/3,q=(l+2*r)/3;
            if(F(p) > F(q)) {
                l=p;
            } else r=q;
        }

        printf("%.4lf\n",F(l));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zhinv/p/9816676.html

时间: 2024-11-08 22:35:30

[LuoguP1883]函数 三分法的相关文章

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> #in

Light Bulb--zoj3203(三分法)

Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has only one light bulb in his house. Every night, he is wandering in his incommodio

三分法

区别于二分法 , 二分法只适用于单调函数 (在一个单调的序列中对某一个元素进行查找) 三分法  突破了这种限制 , 可以用于凸函数或凹函数 , 这是因为凸函数或凹函数必存在一个最值 三分 顾名思义 要将一个线段分成 3 份 , 可以以线段 1/3  与  2/3 的位置 作为 3 分的 基准 ,将此函数分为3段 , 再分别计算 lm  与  lr  所对应的值 , 将较小的一侧全部舍去 , 并且重新赋予 left 与 right ,  一直重复此过程下去 , 直到 right - left >

HDU 4355 Party All the Time(三分法搜索)

HDU 4355 思路:三分法求f(x)极值. f(x)是指位置为x时的愤怒值之和,是一个三次函数,且存在极值点使f(x)最小. code: /* * @author Novicer * language : C++/C */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #i

【算法学习】三分法

我们都知道二分查找以及许多二分的应用. 但是二分主要是对于有单调性的函数或数列才能使用. 如果这个函数/数列没有单调性,而是有一种单峰/谷的特性. 我们可以使用三分法来确定这个函数的极值. 三分法的具体思想可在别处见到. 我就贴一个自己的模板,没有bug-- 因为我曾经被一个有bug的模板坑害了-- 速度非常快,常数应该很小.约是二分的两倍常数左右. 1 l=L,r=R;//确定l,r的初值,保证l<=r哦 2 while(l!=r){ 3 if(r-l<3){//[l,r]超过3就特判 4

P3382 【模板】三分法

题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含义如题目描述所示. 第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数. 输出格式: 输出为一行,包含一个实数,即为x的值.四舍五入保留5位小数. 输入输出样例 输入样例#1: 3 -0.9981 0.5 1 -3 -3 1 输出样例#1: -0.41421 说明 时空限制:50ms,12

【随意学学】三分法

三分法其实是很naive的东西-- 但是不知道为什么蒟蒻我之前一直没空学-- 大概就是求一类单峰的函数,每次把区间三分(以求极小值举例),如果$f(mid1)<f(mid2)$说明解在$[L,mid2]$中,反之解在$[mid2,R]$中. 裸题1:LA 5009 1 #include<bits/stdc++.h> 2 #define N 100005 3 using namespace std; 4 int n,a[N],b[N],c[N]; 5 inline double f(dou

三分法模板

[模板]三分法 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式输入格式: 第一行一次包含一个正整数N和两个实数l.r,含义如题目描述所示. 第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数. 输出格式: 输出为一行,包含一个实数,即为x的值.四舍五入保留5位小数. 输入输出样例 输入样例#1: 3 -0.9981 0.5 1 -3 -3 1 输出样例#1: -0.41421 话说要注意的地方

三分法,一学妹问我什么是三分法,为什么要有三分法

//在单调函数中,我们经常用二分法来快速搜索可行解.在单峰函数中,我们则要用三分法来搜索函数的极值. 一般来说,三分法可以平均分,也可以第一个点分在左右端点的中点,第二个点分在中点和右端点的中点. #include <stdio.h>#include <string.h>#include <iostream>#include <cmath>using namespace std;double h,v;double f(double a){    double