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 ...
随机推荐
- linux忘记mysql密码找回方法
linux忘记mysql教程密码找回方法 今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦. 方法一: # /etc/init. ...
- git如何放弃所有本地修改?
问题描述: 本地做了一些修改,我用git rebase说有冲突.我现在想把本地的请求都干掉,可能有的已经commit过了(没有push过),完全同步成远程版本,应该用什么命令? 使用命令: git r ...
- Android Studio MultiDex 分包碰到的坑
前天准备发包了,测试完毕,打好正式签名包,装到手机上,运行不起来. 网上查了大量资料,都没有解决方案. log显示如下: 04-26 10:07:57.727 1538-1538/? I/MultiD ...
- JQuery------$.get()和$.post()传递数据的使用方法
菜鸟教程地址: http://www.runoob.com/jquery/jquery-ref-ajax.html html(../Home/Index.cshtml) <!DOCTYPE ht ...
- PHP实现观察者模式
<?php //php设计模式观察者模式 /** 被观察者 */ class user implements SplSubject{ public $lognum; public $hobby; ...
- CSS3自适配手机屏幕
@media only screen and (max-width:350px){ .img{ width: 80px; height:70px; background-image: url(./im ...
- Centos7.X 源码编译安装subversion svn1.8.x
说明:SVN(subversion)的运行方式有两种:一种是基于Apache的http.https网页访问形式:还有一种是基于svnserve的独立服务器模式.SVN的数据存储方式也有两种:一种是在B ...
- Yoshua Bengio 2016年5月11日在Twitter Boston的演讲PPT
Yoshua Bengio最新演讲:Attention 让深度学习取得巨大成功(46ppt) Yoshua Bengio,电脑科学家,毕业于麦吉尔大学,在MIT和AT&T贝尔实验室做过博士后研 ...
- Jquery实现textarea根据文本内容自适应高度
本文给大家分享的是Jquery实现textarea根据文本内容自适应高度,这些在平时的项目中挺实用的,所以抽空封装了一个文本框根据输入内容自适应高度的插件,这里推荐给小伙伴们. autoTextare ...
- HighCharts学习笔记(一)HighCharts入门
一.HighCharts简介 Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站 ...