Poj3301 三分法解题报告

来源:互联网 发布:c语言画生日蛋糕 编辑:程序博客网 时间:2024/04/20 08:24

题目要求求解覆盖所有离散在二维空间内的点最小正方形的面积;

1)想到求覆盖所有点,首先想到,那么可以枚举任意两点之间的距离,并求出其中最大距离,作为正方形的边;

按照以上想法来求解当然可以求解出一个能够覆盖所有点的正方形,但是不能保证其是最小的,做一个极端的假设:

假设在我们求出的最小正方形s中,其中两点p1,p2正好落在对角线的两个端点上,那么在p1和p2之间的距离正是想法1中所求出的最大长度,按照想法1去求解的话,所求出的正方形s'一定比s的面积大;

2)进一步思考的话,之所以出现假设与想法1之间矛盾的原因在于:想法1求解的方式只考虑了两点之间的直线距离,但是在二维空间下,覆盖所有点的最小正方形应该由“x方向距离”和“y方向之间距离”的同时来决定的,而能够影响这两个坐标轴距离长短的因素就在于我们如何将这些点投影到二维坐标系中;

3)将n各点投影到二维坐标系中,我们可以以任意点为基点,对所有点进行旋转,考虑到我们主要求解的是最小面积,则在[0,180]与[180,360]之间可以看做是对称的,由此将整个问题转换成将所有点投影到二维坐标系中,枚举角度的问题,具体的枚举方式采用【三分法】(此处不做证明,求二阶导数证明其大于0即可)

具体的坐标转换公式这里不解释了,画图就能看出来;

代码如下:

// 3301_Time0424.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <math.h>#include <iomanip>using namespace std;int t;//test cases numberconst int max_dis=0;struct pos{int x;int y;};pos positions[30];double rotateX(int n,double angle);double rotateY(int n,double angle);int main(){cin>>t;for (;t>0;t--){int n;cin>>n;for (int i=0;i<n;i++){cin>>positions[i].x;cin>>positions[i].y;}double l=0;double r=180;double mid;double maxDismid=0;do {mid=(l+r)/2.0;double midmid=(mid+r)/2.0;maxDismid=max(rotateX(n,mid),rotateY(n,mid));double maxDismidmid=max(rotateX(n,midmid),rotateY(n,midmid));if (maxDismid>maxDismidmid){l=mid;}else{r=midmid;}} while (r-l>0.00000001);printf("%.2f\n",pow(maxDismid,2));}return 0;}double rotateX(int n,double angle){double maxDis=max_dis;for (int i=0;i<n;i++){double rotate_i_x=positions[i].x*cos(angle)+positions[i].y*sin(angle);for (int j=0;j<n;j++){double rotate_j_x=positions[j].x*cos(angle)+positions[j].y*sin(angle);if (maxDis<fabs(rotate_i_x-rotate_j_x)){maxDis=fabs(rotate_i_x-rotate_j_x);}}}return maxDis;}double rotateY(int n,double angle){double maxDis=max_dis;for (int i=0;i<n;i++){double rotate_i_x=positions[i].y*cos(angle)-positions[i].x*sin(angle);for (int j=0;j<n;j++){double rotate_j_x=positions[j].y*cos(angle)-positions[j].x*sin(angle);if (maxDis<fabs(rotate_i_x-rotate_j_x)){maxDis=fabs(rotate_i_x-rotate_j_x);}}}return maxDis;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中行信用卡主付卡的付卡怎么办停 在苏宁网购的移动空调要退货怎么办 单位发的购物卡掉了怎么办 支付宝ofo退押金后余额怎么办 e招贷分期多还了怎么办 别人用我的手机号贷款不还怎么办 电脑文件夹怎么设密码忘记了怎么办 苹果手机id有分机和主机怎么办 绝地求生号被盗了邮箱被改了怎么办 微信邮箱怎么接收不到验证码怎么办 要申请一个特定的qq邮箱号怎么办 中银e贷额度为0怎么办 中银e贷被冻结了怎么办 中国银行e贷款填错了被拒怎么办 中银e贷逾期2天怎么办 大学生助学贷款网站密码忘了怎么办 乳晕毛囊挤压捏起来有小硬节怎么办 手机版模拟人生孕妇任务卡死怎么办 百度网盘的表格没保存怎么办 爱奇艺买的会员不小心删了怎么办 多次举报和拉黑克隆不了好友怎么办 货车把货拉到货主不付钱怎么办 中国银行网银公司用户名忘了怎么办 伟星管网站查不到电水管图纸怎么办 我的耕地己确权被他人侵权怎么办 掌上川电登录密码忘记了怎么办 华为商城不小心点了确认收货怎么办 买的认证服务号没有微信支付怎么办 手机微信里的外网链接打不开怎么办 微信违规无法加入群聊怎么办 苹果手机微信储存空间不足怎么办 拼多多砍价砍不到0元怎么办 妻子婚内出轨我的熟人怎么办 父亲怀疑母亲有外遇作为儿子怎么办 老婆出轨我总心理过不去坎该怎么办 失业人员离培训机构远了怎么办 遇到申请假冒商品的仅退款怎么办 微信被骗什么消息都不知道怎么办 微信用手机登录显示未注册怎么办 唯品会海淘订单取消不了怎么办 大排量摩托芯片钥匙断了怎么办