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们能给予改进的建议!

发布了22 篇原创文章 · 获赞 0 · 访问量 334
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览