简单三分题

点击打开链接
#include < iostream >
#include < cstdio   >
#define  inf 0x3f3f3f
#define  exp    10e-6
using namespace  std;
struct  point
{
	double x,y;
}p[10005];
double Min(double a,double b)
{
	return a>b?b:a;
}
double xie(point b,point a) 
{
	return (a.y-b.y)/(a.x-b.x);
}
double dis(double x,double k,double n)
{
	double s;
	s=n/(x*x)+k*x;
	return s;
}
/* 思路:要求组合函数的最少值,即分段求取
采用二分的方案,求取每个区间的最少值取min */
int main ()
{
	//freopen("t.txt","r",stdin);
	int i,m,n;
	double k,l,r,mid,miid,d;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		for(d=inf,i=0 ; i<m ; i++)
			scanf("%lf%lf",&p[i].x,&p[i].y);
		for(i=1 ; i<m ; i++)
		{
			double s1 , s2;
			k=xie(p[i-1] , p[i]);
			l=p[i-1].x; r=p[i].x;
			while(r-l>exp)
			{
				mid=(l+r)/2;
				miid=(mid+r)/2;
				s1=dis(mid,k,n);
				s2=dis(miid,k,n);
				if(s1>s2) l=mid;
				else      r=miid;
			}
			s2+=(p[i-1].y-k*p[i-1].x);
			d=Min(d,s2);
		}
		printf("%.3lf\n",d);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值