HDU 4355 - 3 분

http://acm.hdu.edu.cn/showproblem.php?pid=4355
제목 n 개인 위치 와 가중치 w
축 위의 실수 점 을 선택 하여 모든 사람 이 이 점 에 도착 하 는 거리 dis 의 3 차원 * w, 의 합 을 구하 십시오.
이거 랑 제일 작 게.
단 봉 함수 로 3 분 해결
#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
",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
",oo);*/ } return 0; }

좋은 웹페이지 즐겨찾기