题意:给定一些点,求最小的正方形,覆盖所有点。
思路:旋转正方形,旋转角度(0~90),利用三分法,找到一个最小的正方形(正确性没证)。
#include<iostream> #include<string> #include<cstdio> #include<cmath> using namespace std; #define esp 1e-10 #define maxcost 99999 class point { public: double x,y; }; point p[35]; int n; double check(double pi) { double ymax=-1*maxcost,ymin=maxcost,xmax=-1*maxcost,xmin=maxcost,tempx,tempy; int i; for(i=0;i<n;i++) { tempx=p[i].x *cos(pi)-p[i].y*sin(pi); tempy=p[i].x *sin(pi)+p[i].y*cos(pi); xmax=xmax>tempx?xmax:tempx; xmin=xmin<tempx?xmin:tempx; ymax=ymax>tempy?ymax:tempy; ymin=ymin<tempy?ymin:tempy; } double len= ymax-ymin>xmax-xmin?ymax-ymin:xmax-xmin; return len; } int main() { int t,i; cin>>t; while(t--) { cin>>n; for(i=0;i<n;i++) cin>>p[i].x >>p[i].y ; double l=0,r=3.1415926/2; while(r-l>esp) { double mid=(r+l)/2; double midmid=(r+mid)/2; double len1=check(mid); double len2=check(midmid); if(len1<=len2) r=midmid; else l=mid; } double ans=check(r); printf("%.2lf\n",ans*ans); } return 0; }