您的位置:首页 > 其它

HDU3714 Error Curves(2010 Asia Chengdu Regional Contest)

2014-08-24 14:27 302 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3714

题意:给定开口向上的二次函数n个f[i] (0<i<n) 定义F(x)=max(si(x)); si(x)表示对于f[i] 当未知数取值x的时候对应的函数值

求F(x) (1<=x<=1000)的最小值

因为f(x)是一个下凸函数所以F(x)也是一个下凸函数,用三分来求最优解,此题精度卡的比较死。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int maxn = 10010;

const double eps= 1e-9;

int a[maxn],b[maxn],c[maxn],n;

double calu(double x){
double ans = a[0]*x*x+b[0]*x+c[0];
for(int i=1;i<n;i++){
double t=a[i]*x*x+b[i]*x+c[i];
if(t>ans) ans=t;
}
return ans;
}

double there_search()
{
double l=0.0,r=1000.0;
double ll,rr;
while(l+eps<r){
ll=(2*l+r)/3;
rr=(2*r+l)/3;
if(calu(ll)>calu(rr))
l=ll;
else
r=rr;
}
return l;
}

int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
double ans=there_search();
printf("%.4lf\n",calu(ans));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐