HDU 4355-三分

http://acm.hdu.edu.cn/showproblem.php?pid=4355

题目 给n个人的位置 和 权值w

选 数轴上一实数点, 求每个人到该点的距离dis的三次方*w,的和


让这个和最小。


分析得,为单峰函数,三分解决

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
//#include <time.h>

using namespace std;

const double pi=acos(-1.0);
double eps=0.000001;

struct node
{
    double x,w;
    node() {}
    node( double a,double b)
    {
        x=a,w=b;
    }
};
node aa[50005];



        int n;
double F(double pos)
{
    double   ans=0;
    for (int i=1; i<=n; i++)
    {
        double sb=fabs(aa[i].x-pos);
        ans+=sb*sb*sb*aa[i].w;
    }
    return ans;
}
//double aaa[10005];
int main()
{
    int t;
    cin>>t;
  //  srand( (unsigned)time( NULL ) );
int cnt=1;
    while(t--)
    {
        cin>>n;
        double x,w;
        int i;
     /*   for (i=1;i<=n;i++)
        aaa[i]=rand()%1000*1.5;*/
        //sort(aaa+1,aaa+1+n);

        for (i=1; i<=n; i++)
        {
            scanf("%lf %lf",&aa[i].x,&aa[i].w);
           // aa[i].x=aaa[i]*pow(-1.0,1.0*i);
           // aa[i].w=rand()%15*1.0;
        }


        double l=-1e6;
        double r=1e6;
      for (i=0;i<100;i++)
        {
            double m1=l+(r-l)/3;
            double m2=r-(r-l)/3;
            if (F(m2)>F(m1))
                r=m2;
            else
                l=m1;
        }

        printf("Case #%d: %.0lf\n",cnt++,F(l));
/*
        double minn=F(1);
        for (i=1;i<=n;i++)
        {
            minn= min(minn,F(i));
        }
        long long oo=(long long) (minn);
        printf("ans2::%lld\n",oo);*/

    }



    return 0;

}


你可能感兴趣的:(HDU 4355-三分)