题意是用“一个”正方形覆盖所有的点
想象如果正方形不能旋转,所需要的边长是这些的最上与最下点的距离,和,最左与最右点的距离,的较大者
当正方形能旋转时,我们只需要把坐标轴旋转,求出旋转后的坐标,再按正方形不能旋转的方式求边长
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <set> #include <algorithm> #include <ctime> #include <vector> #include <string> #include <queue> using namespace std; #define eps 1e-8 #define pi acos(-1.0) #define INF 100000.0 double x[100],y[100]; int n; double cal(double afa) { double xmax,xmin,ymax,ymin,xx,yy; xmax=ymax=-INF; xmin=ymin=INF; for(int i=1;i<=n;++i) { xx=cos(afa)*x[i]-sin(afa)*y[i]; yy=cos(afa)*y[i]+sin(afa)*x[i]; xmax=max(xmax,xx); xmin=min(xmin,xx); ymax=max(ymax,yy); ymin=min(ymin,yy); } return max(xmax-xmin,ymax-ymin); } int main () { int T;scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%lf%lf",&x[i],&y[i]); double left=0.0,right=pi/2,mid1,mid2; while(right-left>eps) { mid1=(left+right)/2; mid2=(mid1+right)/2; if(cal(mid1)<cal(mid2)) right=mid2; else left=mid1; } printf("%.2lf\n",pow(cal(left),2)); } return 0; }