HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)
题目链接: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题 计算几何)的更多相关文章
- HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少? 题意看了好久没懂.圆环 ...
- HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5112 解题报告:扫一遍 #include<cstdio> #include<cstr ...
- HDU 5073 Galaxy(2014鞍山赛区现场赛D题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 解题报告:在一条直线上有n颗星星,一开始这n颗星星绕着重心转,现在我们可以把其中的任意k颗星星移 ...
- HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽 ...
- HDU 5071 Chat(2014鞍山赛区现场赛B题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 解题报告:一个管理聊天窗口的程序,一共有八种操作,然后要注意的就是Top操作只是把编号为u的窗口 ...
- hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举
题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 + 4组 3个相同的牌或者顺子. 只有m.s.p是可以构成顺子的.东西南北这样 ...
- hdu 4438 第37届ACM/ICPC 天津赛区现场赛H题
题意:Alice和Bob两个人去打猎,有两种(只)猎物老虎和狼: 杀死老虎得分x,狼得分y: 如果两个人都选择同样的猎物,则Alice得分的概率是p,则Bob得分的概率是(1-p): 但是Alice事 ...
- HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题
第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...
- 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 ...
随机推荐
- css013 构建基于浮动的布局
css013 构建基于浮动的布局 基于浮动的布局时利用float属性是网页上的元素并排,并创建列 float有三个值:left .right .none 1.假设要把一张图片浮动到网页的左侧 .flo ...
- UnityShader:HSV(色相,饱和度,亮度)转换
http://blog.csdn.net/costfine/article/details/46930473 发现其实美术调整颜色的时候大部分都是调整的HSV,因为可以方便的分别调整色相(hue).饱 ...
- XtraFinder到底好在哪里(标签、隐藏文件、路径拷贝与显示、从这里启动)
类似Chrome的标签 自定义工具栏可添加一个快速显示与隐藏当前目录隐藏文件的功能 拷贝路径 cd 到当前目录这个功能跟PathFinder7类似 当然还有其他很多功能,比如这个返回上级目录,
- SCI答复审稿人的策略和答复信的写作技巧
SCI论文被录用的最后一步 –---答复审稿人的策略和答复信的写作技巧 [好文转载] : 一篇稿子从酝酿到成型历经艰辛,投出去之后又是漫长的等待,好容易收到编辑的回信,得到的往往又是审稿人不留情面的一 ...
- Blue tooth
一 . nordic BLE4.0 1.开发nordic的应用需要安装支持keil的pack库和插件 2.nordic的SDK很完整,实例涵盖了几乎所有的应用 https://www.nordicse ...
- php Hash Table(一) Hash Table的结构
关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...
- VisualStudio.gitignore git 忽略
https://github.com/kaedei/gitignore/blob/master/VisualStudio.gitignore
- Simple colum formatting in Yii 2 GridView
A very important widget in the business apps development is the GridView control. In this post I wil ...
- css居中总结
水平居中 1. inline和inline-*元素水平居中:text-align:center 2. block元素水平居中: block定宽:margin-left: auto; margin-ri ...
- maven jar包库
如果你的项目不是maven项目,比如ant,你的项目需要某些jar包的时候可以到maven 的jar包中心库下载 地址:http://search.maven.org/ http://mvnrepos ...