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 ...
随机推荐
- php格式化金额函数分享
/** * 格式化金额 * * @param int $money * @param int $len * @param string $sign * @return string */ ...
- js002-在HTML中使用JavaScript
js002-在HTML中使用JavaScript 2.1 <script>元素 定义了以下6个属性 async: 可选.表示应该立即下载脚本,但不妨碍页面中的 ...
- android studio中ListView与SQLite的结合使用
Da.java public class Db extends SQLiteOpenHelper { public Db(Context context) { super(context, " ...
- 将一个tabel加到另一个table
DataTable rate = GetRate(str_catchType,); dt.Merge(rate);//将两个table合并
- Linux查看CPU和内存使用情况
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
- 表单提交set集合问题
提交时使用数组接收,遍历将数组添加到set集合 用户表user 字段id,name,set<xk> xks=new HashSet<xk>(); 选课表xk 字段id,name ...
- JavaScript 函数参数传递到底是值传递还是引用传递
tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...
- JS获取字符串实际长度(包含汉字)
方法一: var jmz = {}; jmz.GetLength = function(str) { ///<summary>获得字符串实际长度,中文2,英文1</summary&g ...
- webuploader横向按钮样式
#picker{display: inline-block;line-height: 1.428571429;vertical-align: middle;margin: 0 12px 0 0;wid ...
- verilog阻塞与非阻塞的初步理解(三)
下面这段源码是因为习惯不好,出现不正确波形的例子. module pwm_division(reset,clkin,clkout); input reset,clkin; output clkout; ...