简单的三分查找
三分查找:类似于二分查找,三分搜索法也是比较常用的基于分治思想的高效查找方法。但是和二分不同,二分只适用于单调函数,比如常用的对单调递增或单调递减的一个序列中的某一个元素进行查找,三分却突破了这种限制,可以用于左边递增右边递减或者相反的,这么一类函数,也就是常说的凸函数和凹函数。但是为什么三分法可以用于凸函数或者凹函数呐,这其实是因为这种函数总是有一个最大值或者最小值,这样就可以借此判断出三分法中两个中点相对相对于极值的位置
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int T, n;
double wi;
int x,y,c1,c2;
double ans;
double cal(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void deal(double l, double r)
{
double midl = (l+r)/2;
double midr = (midl+r)/2;
double ans1 = cal(0,0,wi,midl)*c2 + cal(wi,midl,x,y)*c1;
double ans2 = cal(0,0,wi,midr)*c2 + cal(wi,midr,x,y)*c1;
if( fabs(ans1 - ans2) < 1e-6 )
{
ans = ans1;
return ;
}
if( ans1 > ans2 )
{
deal(midl,r);
}
else deal(l,midr);
}
int main()
{
while( cin >> n >> x >> y >> c1 >> c2 )
{
wi = 0;
for(int i = 0 ; i <n ; ++i)
{
int a, b;
scanf("%d %d",&a,&b);
wi += b;
}
deal(0,y) ;
printf("%.2f\n",ans);
}
}