UVA 5009 Error Curves

Problem Description

Josephina is a clever girl and addicted to Machine Learning recently. She
pays much attention to a method called Linear Discriminant Analysis, which
has many interesting properties.
In order to test the algorithm‘s efficiency, she collects many datasets.
What‘s more, each data is divided into two parts: training data and test
data. She gets the parameters of the model on training data and test the
model on test data. To her surprise, she finds each dataset‘s test error
curve is just a parabolic curve. A parabolic curve corresponds to a
quadratic function. In mathematics, a quadratic function is a polynomial
function of the form f(x) = ax2 + bx + c. The
quadratic will degrade to linear function if a = 0.

It‘s very easy to calculate the minimal error if there is only one test
error curve. However, there are several datasets, which means Josephina
will obtain many parabolic curves. Josephina wants to get the tuned
parameters that make the best performance on
all datasets. So she should take all error curves into account, i.e.,
she has to deal with many quadric functions and make a new error
definition to represent the total error. Now, she focuses on the
following new function‘s minimum which related to multiple
quadric functions. The new function F(x) is defined as follows: F(x) =
max(Si(x)), i = 1...n. The domain of x is [0, 1000]. Si(x) is a quadric
function. Josephina wonders the minimum of F(x). Unfortunately, it‘s too
hard for her to solve this problem. As a
super programmer, can you help her?

Input

The input contains multiple test cases. The first line is the number of
cases T (T < 100). Each case begins with a number n (n ≤ 10000).
Following n lines, each line contains three integers a (0 ≤ a ≤ 100), b
(|b| ≤ 5000), c (|c| ≤ 5000), which mean the corresponding
coefficients of a quadratic function.

Output

For each test case, output the answer in a line. Round to 4 digits after the decimal point.

Sample Input

2

1

2 0 0

2

2 0 0

2 -4 2

Sample Output

0.0000

0.5000

画图理解一下,

几个下凸函数取max仍然是下凸函数

然后三分就行了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 double eps=1e-6;
 8 double a[10001],b[10001],c[10001];
 9 int n;
10 double cal(double x)
11 {int i;
12   double tmp=a[1]*x*x+b[1]*x+c[1];
13   for (i=2;i<=n;i++)
14     {
15       tmp=max(tmp,a[i]*x*x+b[i]*x+c[i]);
16     }
17   return tmp;
18 }
19 int main()
20 {int T,i;
21   cin>>T;
22   while (T--)
23     {
24       cin>>n;
25       for (i=1;i<=n;i++)
26     {
27       scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
28     }
29       int t=100;
30       double l=0,r=1000,ans=0;
31       while (t--)
32     {
33       double mid1=l+(r-l)/3.0,mid2=r-(r-l)/3.0;
34       if (cal(mid1)<cal(mid2)) r=mid2;
35       else l=mid1;
36     }
37       printf("%.4lf\n",cal(l));
38     }
39 }

原文地址:https://www.cnblogs.com/Y-E-T-I/p/8288799.html

时间: 2024-11-05 13:36:17

UVA 5009 Error Curves的相关文章

UVA 1476 - Error Curves(三分法)

UVA 1476 1476 - Error Curves 题目链接 题意:给几条下凹二次函数曲线,然后问[0,1000]所有位置中,每个位置的值为曲线中最大值的值,问所有位置的最小值是多少 思路:三分法,由于都是下凹函数,所以所有曲线合并起来,仍然是一个下凹函数,满足单峰,用三分求极值 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using na

UVALive 5009 Error Curves 三分

//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath> #include<climits

UVA - 1476 Error Curves 三分

                                       Error Curves Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which has many interesting properties.In order to test

UVA - 1476 Error Curves (三分搜索)

Description Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which has many interesting properties. In order to test the algorithm's efficiency, she collect

UVa 1476 - Error Curves

题目:给你n条开口向上的二次曲线Si(a>0),定义F(x) = max(Si(x)),求F(x)的最小值. 分析:三分.F(x)是一个单峰函数,先单调递减后单调递增,利用三分求最小值. 首先,证明两个二次函数构造的F2(x)为单峰函数: (如果不成立,则存在两个连续的波谷,交点处一个函数递增另一个递减,矛盾,不会取递减函数) 然后,用数学归纳法证明,Fi(x)为单峰函数,则Fi+1 = max(Fi(x),Si+1(x))也是单峰函数: (如果存在两个(或更多)连续的波谷,交点处一个函数递增另

uva 1476 Error Curves 题解

题意:给n个二次函数f(x),定义F(x)=max(f(x)),即n个二次函数中的最大值.求F(x)在区间[1,1000]内的最小值. 根据题意可以知道,F(x)是单峰函数.于是我们可以三分解决.对于区间[L,R],找它的三等分点M1,M2,如果F(M1)<F(M2),则答案在[L,M2],否则在[M1,R]. 精度最好高一点..只差一两个数量级是不行的,因为有函数会放大误差.. 1 #include<cstdio> 2 #include<algorithm> 3 const

LA 5009 (HDU 3714) Error Curves (三分)

A - Error Curves Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatusPracticeUVALive 5009 Appoint description: Description Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a

hdu3714 Error Curves

题目: Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1151    Accepted Submission(s): 440 Problem Description Josephina is a clever girl and addicted to Machine Learning recently. She

三分 HDOJ 3714 Error Curves

题目传送门 1 /* 2 三分:凹(凸)函数求极值 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 const int MAXN = 1e4 + 10; 11 const int INF = 0x3f3f3f3f; 12 const double EPS = 0.0000000