题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128

解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不能相交,也不能有边和点相交,然后两个矩形的面积之和要最大,求最大的面积之和是多少?如果不存在输出imp

因为n <=30,所以可以先把所有的矩形枚举出来,然后再暴力判断两两矩形组合,首先要满足位置关系,然后取面积和最大就是了.要注意的地方就是要小心一个大矩形包含一个小矩形的情况,在这种情况下,是满足位置关系的,但是,总面积只等于外面那个大矩形的面积.

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps = 1e-;
struct point
{
double x,y;
point(double x = ,double y = ): x(x),y(y) {}
friend point operator - (point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
}P[];
struct rect
{
point p[];
}R[];
double dot(point a,point b) //叉积
{
return a.x*b.y - b.x * a.y;
}
int judge_pingxing(point a,point b)
{
return (fabs(dot(a,b)) < eps);
}
double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int is_trang(point p1,point p2,point p3,point p4) //判断是不是矩形
{
point d1 = p1 - p2;
point d2 = p3 - p4;
if(judge_pingxing(d1,d2))
{
if(p1.x > p2.x) swap(p1,p2);
if(p3.x > p4.x) swap(p3,p4);
d1 = p1-p2,d2 = p1-p3;
point d3 = p1 - p3,d4 = p2 - p4;
// printf("%.0lf %.0lf\n",d1.x,d1.y);
// printf("%.0lf %.0lf\n",d2.x,d2.y);
// printf("%.0lf\n",d1.x*d2.x+d1.y*d2.y);
if(fabs(d1.x*d2.x+d1.y*d2.y) < eps && judge_pingxing(d3,d4)) return ;
}
return ;
}
int make(int n) //构造矩形
{
int tot = ;
for(int i = ;i < n;++i)
for(int j = i+;j < n;++j)
for(int k = j+;k < n;++k)
for(int l = k+;l < n;++l)
{
if(is_trang(P[i],P[j],P[k],P[l]) || is_trang(P[i],P[k],P[j],P[l]))
{
R[tot].p[] = P[i];
R[tot].p[] = P[j];
R[tot].p[] = P[k];
R[tot].p[] = P[l];
tot++;
}
}
return tot;
}
double Max(double a,double b)
{
return a > b? a:b;
}
int is_xj(point a1,point a2,point b1,point b2)
{
if(dot(b1-a1,a2-a1)*dot(b2-a1,a2-a1) < || fabs(dot(b1-a1,a2-a1)*dot(b2-a1,a2-a1)) < eps)
if(dot(a1-b1,b2-b1)*dot(a2-b1,b2-b1) < || fabs(dot(a1-b1,b2-b1)*dot(a2-b1,b2-b1)) < eps)
{
double m = dis(a1,b1);
m = Max(m,dis(a1,b2));
m = Max(m,dis(a1,a2));
m = Max(m,dis(a2,b1));
m = Max(m,dis(a2,b2));
m = Max(m,dis(b1,b2));
if(fabs(dot(a1-a2,b1-b2))<eps && m > dis(a1,a2)+dis(b1,b2)) return ;
return ;
}
return ;
}
struct node
{
point p[];
}rr1[],rr2[];
int judge(rect a,rect b)
{
rr1[].p[] = a.p[],rr1[].p[] = a.p[];
rr1[].p[] = a.p[],rr1[].p[] = a.p[];
rr1[].p[] = a.p[],rr1[].p[] = a.p[];
rr1[].p[] = a.p[],rr1[].p[] = a.p[]; rr2[].p[] = b.p[],rr2[].p[] = b.p[];
rr2[].p[] = b.p[],rr2[].p[] = b.p[];
rr2[].p[] = b.p[],rr2[].p[] = b.p[];
rr2[].p[] = b.p[],rr2[].p[] = b.p[];
for(int i = ;i < ;++i)
for(int j = ;j < ;++j)
if(is_xj(rr1[i].p[],rr1[i].p[],rr2[j].p[],rr2[j].p[]))
return ;
/* for(int i = 0;i < 4;++i) //只要枚举一个矩形的顶点是不是在另一个矩形里面或者边上
for(int j = i+1;j < 4;++j)
{
for(int k = 0;k < 4;++k)
for(int l = k+1;l < 4;++l)
{
if(is_xj(a.p[i],a.p[j],b.p[k],b.p[l]))
return 0;
}
}*/
return ;
} bool cmp(point a,point b)
{
if(fabs(a.x-b.x) > eps)
return a.x < b.x;
else return a.y < b.y;
}
double get_area(rect a)
{
return dis(a.p[],a.p[]) * dis(a.p[],a.p[]);
}
int judge_in(rect a,rect b)
{
int flag = ;
for(int i = ;i < ;++i)
{
if((a.p[i].x > b.p[].x && a.p[i].x < b.p[].x)) flag++;
if((a.p[i].y > b.p[].y && a.p[i].y < b.p[].y)) flag++;
}
return flag >= ;
} int main()
{
//printf("%d\n",is_trang(point(0,0),point(1,0),point(1,1),point(0,1)));
// freopen("in","r",stdin);
int n;
while(scanf("%d",&n),n)
{
for(int i = ;i < n;++i)
scanf("%lf%lf",&P[i].x,&P[i].y);
sort(P,P+n,cmp);
int tot = make(n); //构造tot个矩形
double Max_ans = ;
for(int i = ;i < tot;++i)
sort(R[i].p,R[i].p+,cmp);
// printf("tot = %d\n",tot);
for(int i = ;i < tot;++i)
{
// for(int j = 0;j < 4;++j)
// printf("%.0lf %.0lf ",R[i].p[j].x,R[i].p[j].y);
// puts("");
}
// printf("dlfjksdklj = %d\n",judge_in(R[1],R[0]));
for(int i = ;i < tot;++i)
for(int j = i;j < tot;++j)
if(judge(R[i],R [j])) //满足位置关系 ,注意一个矩形包含另一个矩形的情况
{
double t = get_area(R[i]) + get_area(R[j]); //求两个矩形的面积
if(judge_in(R[i],R[j]) || judge_in(R[j],R[i])) Max_ans = Max(Max_ans,Max(get_area(R[i]),get_area(R[j])));
else Max_ans = Max(Max_ans,t);
}
if(tot <= || fabs(Max_ans) < eps) printf("imp\n");
else printf("%.0lf\n",Max_ans+eps);
}
return ;
}

HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)的更多相关文章

  1. HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少? 题意看了好久没懂.圆环 ...

  2. HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5112 解题报告:扫一遍 #include<cstdio> #include<cstr ...

  3. HDU 5073 Galaxy(2014鞍山赛区现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 解题报告:在一条直线上有n颗星星,一开始这n颗星星绕着重心转,现在我们可以把其中的任意k颗星星移 ...

  4. HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽 ...

  5. HDU 5071 Chat(2014鞍山赛区现场赛B题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 解题报告:一个管理聊天窗口的程序,一共有八种操作,然后要注意的就是Top操作只是把编号为u的窗口 ...

  6. hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举

    题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 +  4组 3个相同的牌或者顺子.  只有m.s.p是可以构成顺子的.东西南北这样 ...

  7. hdu 4438 第37届ACM/ICPC 天津赛区现场赛H题

    题意:Alice和Bob两个人去打猎,有两种(只)猎物老虎和狼: 杀死老虎得分x,狼得分y: 如果两个人都选择同样的猎物,则Alice得分的概率是p,则Bob得分的概率是(1-p): 但是Alice事 ...

  8. HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题

    第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...

  9. Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)

    http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=c ...

随机推荐

  1. linux命令使用记录

    netstat: -a show both listening and none-listening sockets.默认是不显示listening sockets -t 仅显示tcp相关 默认是都显 ...

  2. JavaWeb---总结(三)Tomcat服务器学习和使用(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  3. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  4. 获取jsp页面的宽和高

    var winWidth; var winHeight; function getResult() { if(window.innerWidth) { winWidth=window.innerWid ...

  5. ecstore小记

    主要app base 基础MVCdbeav 数据库扩展pam 登录认证setup 系统安装工具image 图片存取site 站点desktop 后台操作ectools 电商基础工具b2c 订单,商品, ...

  6. Java抽象类与接口的关系

  7. 《深入理解bootstrap》读书笔记:第三章 CSS布局

    一. 概述一下理念 bootstrap基于H5开发.提倡移动先行(媒询声明是必须的),对浏览器支持面不是很广. 响应式图片:max-width:100% height:auto; 可以加上:.img- ...

  8. JS之function的应用

    1.最基本的作为一个本本分分的函数声明使用. 复制代码代码如下: function func(){} 或 var func=function(){};  2.作为一个类构造器使用: 复制代码代码如下: ...

  9. PhpStorm 快捷键

    不容易记住的: Ctrl + Shift + F  查找文本,在项目目录或指定的目录 Ctrl + Shift + R  查找文本并替换,在项目目录或指定的目录 Ctrl + E    打开最近关闭的 ...

  10. 新浪微博客户端(35)-使用NSMutableAttributedString实现多行文本的效果

    DJComposeViewController.m import "DJComposeViewController.h" #import "DJAccountTool.h ...