开始就是瞄着三分来做的,但看题目,感觉是旋转卡壳吧。。可是,用了旋转卡壳还三分条毛啊。。
可以令正方形不旋转,而改为令点绕原点旋转,这样,很好的解决了问题,就可以比较X轴最大长度和Y轴最大长度来确定正方形的边长了。然后三分旋转角度就可以了。
#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; struct Point{ double x,y; }; Point point[50]; int n; Point tmp[50]; const double inf=1e10; double cal(double ang){ double x,y; double xmax=-inf,xmin=inf; double ymax=-inf,ymin=inf; for(int i=1;i<=n;i++){ x=cos(ang)*point[i].x-sin(ang)*point[i].y; y=cos(ang)*point[i].y+sin(ang)*point[i].x; xmax=max(xmax,x); xmin=min(xmin,x); ymax=max(ymax,y); ymin=min(ymin,y); } return max((xmax-xmin),(ymax-ymin))*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",&point[i].x,&point[i].y); } double l=0,r=180; double m,mm; while(l+(1e-8)<r){ m=l+(r-l)/3; mm=r-(r-l)/3; if(cal(m)>cal(mm)) l=m; else r=mm; } printf("%.2lf ",cal(l)); } return 0; }