zoukankan      html  css  js  c++  java
  • Cogs 1500. 误差曲线(三分)

    1. 误差曲线
      ★★ 输入文件:errorcurves.in 输出文件:errorcurves.out 评测插件
      时间限制:1 s 内存限制:256 MB
      【题目描述】
      Josephina是一名聪明的妹子,她最近痴迷于机器学习。她花费了大量精力学习线性判别分析,因为其中有不少有趣的性质。
      为了测试算法的性能,她收集了许多数据。每组数据都分成两个部分:训练数据和测试数据。她在训练数据中解算模型的参数,并且在测试数据中测试这个模型。
      令她惊讶的是,她发现每组数据的误差曲线都是一条抛物线。一条抛物线对应一个二次函数。在数学中,二次函数指形如f(x)=ax2+bx+c的多项式函数。如果a=0,二次函数就退化为线性函数。
      如果只有一条误差曲线,那么计算最小的误差将非常简单。但这里有多组数据,这意味着Josephina将得到多组误差曲线。Josephina希望调整参数以更好地拟合所有数据。因此她必须统计所有的误差曲线。也就是说,她必须处理许多二次函数,并得出一条新的错误曲线来代表所有的错误。现在,她正关注一个与许多二次函数有关的函数的最小值。
      这个新函数定义如下:
      F(x)=max(Si(x)),i=1,2,…,n。x的范围是[0,1000]。Si(x)是一个二次函数。
      Josephina希望知道F(x)的最小值。不幸的是,用代数方法求解过于复杂。作为一名机智的程序员,你能帮她解决这个问题吗?
      【输入格式】
      输入包含多组数据。
      输入文件的第1行是1个正整数T(T<100),表示数据组数。
      每组数据的第1行是一个正整数n(n<=10000)。
      接下来的n行,每行有3个正整数a(0<=a<=100),b(|b|<=5000),c(|c|<=5000),描述一个二次方程的相应系数。
      【输出格式】
      对每组数据,输出一行一个实数,即答案。
      【样例输入】
      2
      1
      2 0 0
      2
      2 0 0
      2 -4 2
      【样例输出】
      0.0000
      0.5000
      【提示】
      答案允许有不超过0.01的误差。
      【来源】
      **UVa1476 Error Curves
      刘汝佳,《算法竞赛入门经典训练指南》表2-14**
    /*
    这题卡精度吖卡精度.
    测评插件坑爹啊啊啊啊啊啊啊.
    so 最后跟风判的L orz.
    这题手画几个函数把没用的曲线去掉
    就会神奇的发现答案有凸性.
    然后用三分搞凸性. 
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 100001
    #define eps 1e-7
    using namespace std;
    int n,t,a[MAXN],b[MAXN],c[MAXN];
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    double check(double x)
    {
        double tot=-1e9;
        for(int i=1;i<=n;i++) tot=max(tot,double(a[i]*x*x+b[i]*x+c[i]));
        return tot;
    }
    void sanfen()
    {
        double l=0,r=1000,lmid,rmid,ans=0;
        while(l+eps<=r)
        {
            lmid=(2*l+r)/3,rmid=(l+2*r)/3;
            if(check(lmid)<=check(rmid)) r=rmid,ans=r;
            else l=lmid;
        }
        double x=check(l);
        printf("%.2lf
    ",x);return ;
    }
    int main()
    {
        freopen("errorcurves.in","r",stdin);
        freopen("errorcurves.out","w",stdout);
        t=read();
        while(t--)
        {
            n=read();
            for(int i=1;i<=n;i++) a[i]=read(),b[i]=read(),c[i]=read();
            sanfen();
        }
        return 0;
    }
  • 相关阅读:
    Python long() 函数
    Python frozenset() 函数
    java对象和构造方法的区别
    回顾方法和方法调用及加深
    面向过程&面向对象
    稀疏数组
    冒泡排序与八大排序
    Arrays类与常用功能
    二维数组的理解代码
    数组的使用
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068094.html
Copyright © 2011-2022 走看看