百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

2024-09-07 18:38

本文主要是介绍百度之星初赛1006(计算几何:能包含凸包的最小矩形面积),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

矩形面积

 
 Accepts: 717
 
 Submissions: 1619
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少。

Input

第一行一个正整数 T,代表测试数据组数( 1T20 ),接下来 T 组测试数据。

每组测试数据占若干行,第一行一个正整数  N(1N<1000) ,代表矩形的数量。接下来 N 行,每行 8 个整数 x1,y1,x2,y2,x3,y3,x4,y4 ,代表矩形的四个点坐标,坐标绝对值不会超过10000。

Output

对于每组测试数据,输出两行:

第一行输出"Case #i:",i 代表第 i 组测试数据。 第二行包含1 个数字,代表面积最小的矩形的面积,结果保留到整数位。

Sample Input
2
2
5 10 5 8 3 10 3 8
8 8 8 6 7 8 7 6
1
0 0 2 2 2 0 0 2
Sample Output
Case #1:
17
Case #2:
4

问题可以转化为平面上有4*n个点,求能够包含这些点的最小矩形面积,直接上模板(蓝儿弱没怎么做计算几何,都不知道,先mark一下)
#include<stdio.h>
#include<cmath>
#include<algorithm>
#define eps 1e-8
#define N 50010
using namespace std;
struct Point
{double x,y;Point() {}Point(double x0,double y0):x(x0),y(y0) {}
};
Point p[N];
int con[N];
int cn;
int n;
struct Line
{Point a,b;Line() {}Line(Point a0,Point b0):a(a0),b(b0) {}
};
double Xmult(Point o,Point a,Point b)
{return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
}
double Dmult(Point o,Point a,Point b)
{return (a.x-o.x)*(b.x-o.x)+(a.y-o.y)*(b.y-o.y);
}
int Sig(double a)
{return a<-eps?-1:a>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 cmp(Point a,Point b)
{double d=Xmult(p[0],a,b);if(d>0)return 1;if(d==0 && Dis(p[0],a)<Dis(p[0],b))return 1;return 0;
}
double min(double a,double b)
{return a<b?a:b;
}
void Graham()
{int i,ind=0;for(i=1; i<n; i++)if(p[ind].y>p[i].y || (p[ind].y==p[i].y) && p[ind].x>p[i].x)ind=i;swap(p[ind],p[0]);sort(p+1,p+n,cmp);con[0]=0;con[1]=1;cn=1;for(i=2; i<n; i++){while(cn>0 && Sig(Xmult(p[con[cn-1]],p[con[cn]],p[i]))<=0)cn--;con[++cn]=i;}int tmp=cn;for(i=n-2; i>=0; i--){while(cn>tmp && Sig(Xmult(p[con[cn-1]],p[con[cn]],p[i]))<=0)cn--;con[++cn]=i;}
}
double Solve()
{int t,r,l;double ans=999999999;t=r=1;if(cn<3)return 0;for(int i=0; i<cn; i++){while(Sig( Xmult(p[con[i]],p[con[i+1]],p[con[t+1]])-Xmult(p[con[i]],p[con[i+1]],p[con[t]])   )>0)t=(t+1)%cn;while(Sig( Dmult(p[con[i]],p[con[i+1]],p[con[r+1]])-Dmult(p[con[i]],p[con[i+1]],p[con[r]])   )>0)r=(r+1)%cn;if(!i) l=r;while(Sig( Dmult(p[con[i]],p[con[i+1]],p[con[l+1]])-Dmult(p[con[i]],p[con[i+1]],p[con[l]])   )<=0)l=(l+1)%cn;double d=Dis(p[con[i]],p[con[i+1]]);double tmp=Xmult(p[con[i]],p[con[i+1]],p[con[t]])*( Dmult(p[con[i]],p[con[i+1]],p[con[r]])-Dmult(p[con[i]],p[con[i+1]],p[con[l]]) )/d/d;ans=min(ans,tmp);}return ans;
}
int main()
{int i; int T, cas = 1;scanf("%d", &T);while(T --){scanf("%d",&n);n *= 4;for(i=0; i<n; i++)scanf("%lf%lf",&p[i].x,&p[i].y);Graham();printf("Case #%d:\n%.0f\n",cas ++, Solve());}return 0;
}


这篇关于百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145842

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <