关闭

三分搜索

标签: 搜索
186人阅读 评论(0) 收藏 举报
分类:

二分所查找的序列是单调的,把区间分为相等的两段,三分所查找的序列是凸型或凹形函数,为了查找函数的最值。

hdu 4355

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;

const double eps=1e-5;
const int MAX=50010;

double p[MAX],w[MAX];
int n;

double equ(double x)
{
    double ans=0;
    for(int i=0;i<n;i++)
    {
        double S=fabs(p[i]-x);
        ans+=w[i]*S*S*S;
    }
    return ans;
}

double ternarySearch(double l,double r)
{
    while(r-l>eps)
    {
        double ll=(2*l+r)/3;
        double rr=(l+2*r)/3;
        double ans1=equ(ll);
        double ans2=equ(rr);
        if(ans1>ans2)
            l=ll;
        else
            r=rr;
    }
    return l;
}

int main()
{
    int T,i;
    scanf("%d",&T);
    for(int t=1;t<=T;t++)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        scanf("%lf%lf",&p[i],&w[i]);
        double l=p[0],r=p[n-1];
        double tmp=ternarySearch(l,r);
        printf("Case #%d: %.0lf\n",t,equ(tmp));
    }
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:24739次
    • 积分:1966
    • 等级:
    • 排名:第19941名
    • 原创:182篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论