三分查找——POJ3301

三分

主要推出fun函数

fun(A)的意义就是在原来坐标上的点经过A弧度逆旋转后,正方形(边与坐标轴平行)最小边长要多长

fun()在旋转的时候符合凸函数,所以三分求最值

View Code
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;

const double maxn=0xfffffffffffff;
const double minn=-0xfffffffffffff;
const double PI=acos(-1.0);

double x[39],y[39];
int n;

double fun(double a)
{
double maxx=minn,minx=maxn,maxy=minn,miny=maxn;
int i;
for(i=1;i<=n;i++)
{
double tx,ty;
tx=x[i]*cos(a)-y[i]*sin(a);
ty=y[i]*cos(a)+x[i]*sin(a);

maxx=max(maxx,tx);
minx=min(minx,tx);
maxy=max(maxy,ty);
miny=min(miny,ty);
}

return max(maxx-minx,maxy-miny);
}

int main()
{

int t,i;
double ll,rr,mid,midmid;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}

ll=0;
rr=PI;
while(ll+0.00000000000001<rr)
{
mid=(ll+rr)/2.0;
midmid=(mid+rr)/2.0;
if(fun(mid)<=fun(midmid))
{
rr=midmid;
}
else
ll=mid;
}

printf("%.2lf\n",fun(ll)*fun(ll));
}
}



原文地址:https://www.cnblogs.com/huhuuu/p/2316640.html