poj3301——Texas Trip

本文介绍了一种通过旋转正方形并使用三分法来寻找能够覆盖一组给定点的最小正方形的方法。该方法通过调整正方形的角度,在0到90度之间进行搜索,最终找到覆盖所有点的最小正方形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定一些点,求最小的正方形,覆盖所有点。

思路:旋转正方形,旋转角度(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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值