码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4355 数轴上的点找使Si^3*Wi最小的和-浮点数三分

时间:2015-08-01 18:59:12      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:hdu   三分   

题意:一个数轴上有n个点,现在要找一个点到所有点的距离Si的立方乘以点的权Wi的和最小

分析:三分。浮点数的二分或者三分可以直接用一个数字来限制查找的次数。TLE了几次,把查找次数从10000改到100就过了,本来以为数据范围比较大,100的精度不够。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define eps 1e-8
#define eps2 1e-5
#define INF  100000000000007
using namespace std;
int t,n;
double x[100005],w[100005];
double ans;
long long ans1;
double dis(double a,double b)
{
	if(a>b){
		double tmp=a;
		a=b;
		b=tmp;
	}
	return pow((b-a),3);
	
}
double ll(double a)
{
	double sum=0;
	for(int i=0;i<n;i++){
		sum+=dis(a,x[i])*w[i];
	}
	return sum;
}
double find(double left,double right)
{
	double l=left,r=right;
	double ans1,ans2;
	for(int i=0;i<100;i++){
		double mid1=(l+r)/2.0;
		double mid2=(mid1+r)/2.0;
		ans1=ll(mid1);
		ans2=ll(mid2);
		if(ll(mid1)<ll(mid2))  r=mid2;
		else  l=mid1;
	}
	return ans1;
}
int main()
{
	scanf("%d",&t);
	for(int cas=1;cas<=t;cas++){
		scanf("%d",&n);
		for(int i=0;i<n;i++) scanf("%lf%lf",&x[i],&w[i]);
		ans=find(x[0],x[n-1]);
	    ans1=(long long int)(ans+0.5);	
		printf("Case #%d: %I64d\n",cas,ans1);
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 4355 数轴上的点找使Si^3*Wi最小的和-浮点数三分

标签:hdu   三分   

原文地址:http://blog.csdn.net/ac_0_summer/article/details/47188645

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!