UVALive5009(Error Curves)-三分求极值
来源:互联网 发布:seo报价 编辑:程序博客网 时间:2024/05/22 01:47
题目链接:Error Curves
题意:给出n个开口向上的二次函数(或一次函数,常数函数)Si(x),F(x) = max(Si(x)), i = 1,2,3,...,n,
F(x)的定义域为[0,1000],求F(x)的最小值,输出保留四位小数。
思路:
开口朝上的二次函数是下凸函数,两个开口朝上的二次函数在定义域内取最大值得到的函数还是一个下凸函数,若多个开口朝上的
二次函数在定义域内取最大值,得到的函数还是下凸函数,因为可以两个两个的组合,两个组合后得到一个下凸函数,用新得到的下凸函数
与其他的二次函数组合后还是下凸函数,这样一直组合,到最后即得到一个下凸函数。另,下凸函数与一次函数,常数函数组合后得到的还是下凸函数。
所以这个题,其实就是给定下凸函数求极值的问题,可以用三分来做。
代码:
# pragma comment(linker, "/STACK:1024000000,1024000000")# include <iostream># include <algorithm># include <cstdio># include <cstring># include <bitset># include <cmath>using namespace std;typedef long long LL;const int maxn = 1e4 + 5;int a[maxn], b[maxn], c[maxn];int n;double sqr(double x) { return x * x;}double f(double x) { double ans = a[0] * sqr(x) + b[0] * x + c[0]; for (int i = 1; i < n; ++i) { ans = max(ans, a[i] * sqr(x) + b[i] * x + c[i]); } return ans;}int main(void){ 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 l = 0.0, r = 1000.0; for (int i = 0; i < 100; ++i) { double m1 = l + (r - l) / 3; double m2 = r - (r - l) / 3; if (f(m1) <= f(m2)) r = m2; else l = m1; } printf("%.4f\n", f(l)); } return 0;}
阅读全文
0 0
- UVALive5009(Error Curves)-三分求极值
- HDU3714(Error Curves)三分求二次函数的极值
- UVA1476——Error Curves (三分求极值)
- uvalive5009(三分)
- 【三分】Error Curves
- UVA5009 Error Curves三分
- poj3737_三分求极值
- [HDU3400]三分求极值
- 三分求极值
- 三分求极值
- 求极值--三分
- hdu3714 Error Curves---三分复习
- [三分]HDOJ 3714Error Curves
- la 5009 - Error Curves(三分)
- uva 1476 - Error Curves(三分)
- zoj 3421 Error Curves(三分)
- LA5009 Error Curves(三分)
- HDU3714:Error Curves(三分)
- BMA与NBMA
- 用户角色权限分析
- gitlab 搭建与使用
- shell基础
- Zero's Number HDU
- UVALive5009(Error Curves)-三分求极值
- BZOJ 1614: [Usaco2007 Jan]Telephone Lines架设电话线
- View Animation(视图动画)
- Hadoop基础教程-第12章 Hive:进阶(12.4 Hive Metastore)(草稿)
- git命令的使用
- 剑指offer_数组---最小的K个数
- 二级C++语言程序设计考试大纲(2013年版)
- jsday03补充(函数匿名和动态)
- ===(绝对等于)