2019_GDUT_新生专题 I --- K

[HDU] 3714 — Error Curves 三分

原题链接:https://vjudge.net/problem/18677/origin

题目大意:

给出多条二次或一次曲线(Si(x) = ax^2 + bx + c,a>=0);构造一条能代表所以曲线的曲线F(x) = max{Si(x)};求出这条曲线的最小值。

题目分析:

知识点
三分可用来求一个只有一个顶点的曲线的最大或最小值
题目的曲线F(x)先减后增,设最小值为F(m),在区间取两点p1<p2,如果F(p1)>F(p2),那么一定满足m>p1;反之,如果F(p1)<F(p2),那么一定满足m<p2。
解决
运用三分和循环,不断逼近最小值。

代码实现:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n;
//储存曲线
int cur[10000][3];
//求F(x),即比较每个函数
double max_c(double x)
{
    int i;
    double value, max_v;
    for(i=0; i<n; i++){
        value = cur[i][0] * x * x + cur[i][1] * x + cur[i][2];
        if(i == 0){
            max_v = value;
            continue;
        }
        if(value > max_v) max_v = value;
    }
    return max_v;
}

int main()
{
    int t;
    int i, j;
    double ans;
    double l, r, mid, mid3;
    cin >> t;
    while(t--)
    {
        cin >> n;
        for(i=0; i<n; i++){
            for(j=0; j<3; j++){
                cin >> cur[i][j];
            }
        }
        //三分
        l = 0; r = 1001;
        while(r - l > 1e-9)
        {
            mid = (l + r) / 2;//左点
            mid3 = (mid + r) / 2;//右点
            if(max_c(mid) > max_c(mid3)){
                l = mid;
            }
            else{
                r = mid3;
            }
        }
        ans = max_c(r);
        printf("%.4f\n",ans);
    }


    return 0;
}


最后,希望路过的dl们能给予改进的建议!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值