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