您的位置:首页 > 其它

HDU 4355-三分

2016-04-22 23:59 232 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: