2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)

矩形面积

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 168    Accepted Submission(s): 93

Problem Description

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

Input

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

每组测试数据占若干行,第一行一个正整数 N(1≤N<≤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

Source

2015年百度之星程序设计大赛 - 初赛(1)

 1 #include<stdio.h>
 2 #include<set>
 3 #include<algorithm>
 4 #include<string.h>
 5 #define one first
 6 #define two second
 7 #define zero 1e-12
 8 #define sgn(x) (fabs(x)<zero?0:(x>0?1:-1))
 9 #define shadow(a,b,c)  ((b.one-a.one)*(c.one-a.one)+(b.two-a.two)*(c.two-a.two))/sqrt((b.one-a.one)*(b.one-a.one)+(b.two-a.two)*(b.two-a.two))
10 #define cross(a,b,c) ((b.one-a.one)*(c.two-a.two)-(b.two-a.two)*(c.one-a.one))
11 #define cmp(a,b) (a.one<b.one || sgn(a.one-b.one)==0 && a.two<b.two)
12 const int M = 5000 , inf = 0x3f3f3f3f ;
13 int n ;
14 std::pair<double , double > p[M] ;
15 double s[M];
16 std::pair<double , double > jk[M] ;
17 int tot ;
18
19 void hull(int l,int r, std::pair<double , double>a,std::pair<double , double> b){
20     int x=l,i=l-1,j=r+1,k;
21     for (k=l;k<=r;k++){
22         double temp=sgn(s[x]-s[k]);
23         if (temp<0 || temp==0 && cmp(p[x],p[k])) x=k;
24     }
25     std::pair<double , double> y=p[x];
26     for (k=l;k<=r;k++){
27         s[++i]=cross(p[k],a,y);
28         if (sgn(s[i])>0) std::swap(p[i],p[k]); else i--;
29     }
30     for (k=r;k>=l;k--){
31         s[--j]=cross(p[k],y,b);
32         if (sgn(s[j])>0) std::swap(p[j],p[k]); else j++;
33     }
34     if (l<=i) hull(l,i,a,y);
35     jk[tot ++] = y ;
36     if (j<=r) hull(j,r,y,b);
37 }
38
39 void solve ()
40 {
41     double l , r , h , sum = inf ;
42     double d = 0 ;
43     for (int i = 1 ; i <= tot ; i ++) {
44         d = (jk[i].one - jk[i - 1].one) * (jk[i].one - jk[i - 1].one) + (jk[i].two - jk[i - 1].two) * (jk[i].two - jk[i - 1].two) ;
45         l = 0 , r = sqrt (d) ;
46         h = 0 ;
47         for (int j = 1 ; j <= n ; j ++) {
48             if (p[j] != jk[i] && p[j] != jk[i - 1]) {
49                 h = std::max (h , fabs (cross (jk[i] , jk[i - 1] , p[j])) / sqrt(d)) ;
50                 l = std::min (l , shadow (jk[i] , jk[i - 1] , p[j])) ;
51                 r = std::max (r , shadow (jk[i] , jk[i - 1] , p[j])) ;
52             }
53         }
54         sum = std::min (sum , (r - l) * h) ;
55     }
56     printf ("%.0f\n" , sum) ;
57 }
58
59 int main(){
60    //freopen ("a.txt" , "r" , stdin) ;
61    int T , cas = 1 ;
62    scanf ("%d" , &T) ;
63    while (T --) {
64         printf ("Case #%d:\n" , cas ++) ;
65         memset (s , 0 , sizeof(s)) ;
66         int i , x=0 ;
67         tot = 0 ;
68         scanf("%d",&n);
69         n *= 4 ;
70         for (i=1;i<=n;i++){
71             scanf("%lf%lf",&p[i].one,&p[i].two);
72             if (x==0 || cmp(p[i],p[x])) x=i;
73         }
74         std::swap(p[1],p[x]);
75         jk[tot ++] = p[1] ;
76         hull(2,n,p[1],p[1]);
77         jk[tot] = jk[0] ;
78         solve () ;
79     }
80     return 0;
81 }

 1 #include<bits/stdc++.h>
 2 #define one first
 3 #define two second
 4 #define eps 1e-12
 5 #define sgn(x) (x<eps?0:(x>0?1:-1))
 6 #define cross(a,b,c) ((b.one-a.one)*(c.two-a.two)-(b.two-a.two)*(c.one-a.one))
 7 #define cmp(a,b) (a.one<b.one || sgn(a.one-b.one)==0 && a.two<b.two)
 8 const int M = 1e5 , inf = 0x3f3f3f3f ;
 9 int n ;
10 std::pair<double , double> p [M] ;
11 int s[M] ;
12 std::pair<double , double> jk[M] ;
13 int tot = 0 ;
14
15 void hull (int l , int r , std::pair<double , double> a , std::pair<double , double> b)
16 {
17     //printf ("(%d , %d)\n" , l , r ) ;
18     int x = l , _l = l - 1 , _r = r + 1 ;
19     for (int i = l ; i <= r ; i ++) {
20         int tmp = sgn(s[i]-s[x]) ;
21         if (tmp > 0 || tmp == 0 && cmp(p[x],p[i])) x = i ;
22     }
23     for (int i = l ; i <= r ; i ++) {
24         s[++ _l] = cross(p[i],a,p[x]) ;
25         if (sgn(s[_l]) > 0) std::swap (p[i] , p[_l]) ; else _l -- ;
26     }
27     for (int i = r ; i >= l ; i --) {
28         s[-- _r] = cross(p[i],p[x],b) ;
29         if (sgn(s[_r]) > 0) std::swap (p[i] , p[_r]) ; else _r ++ ;
30     }
31     if (l <= _l)hull (l , _l , a , p[x]) ;
32     jk[tot ++] = p[x] ;
33     if (_r <= r)hull (_r , r , p[x] , b) ;
34 }
35
36 int main ()
37 {
38    // freopen ("a.txt" , "r" , stdin ) ;
39     memset (s , 0 , sizeof(s)) ;
40     scanf ("%d" , &n) ; //printf ("n = %d\n" , n ) ;
41     int x = -1 ;
42     for (int i = 1 ; i <= n ; i ++) {
43         scanf ("%lf%lf" , &p[i].one , &p[i].two) ;
44         if (x == -1 || cmp (p[i] , p[x])) x = i ;
45     }
46     std::swap (p[x] , p[1]) ;
47     jk[tot ++] = p[1] ;
48     hull (2 , n , p[1] , p[1]) ;
49     for (int i = 0 ; i < tot ; i ++) printf ("(%.4f , %.4f)\n" , jk[i].one , jk[i].two) ;
50     return 0 ;
51 }

92_quickhull

orz,orz

时间: 2024-12-05 00:00:19

2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)的相关文章

2015年百度之星初赛(1) --- F 矩形面积

矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input 第一行一个正整数 T,代表测试数据组数($1 \leq T \leq 20$),接下来 T 组测试数据. 每组测试数据占若干行,第一行一个正整数 $N(1 \leq N < \leq 1000)$,代表矩形的数量.接下来 N 行,每行 8 个整数$x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4$

25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

package zhongqiuzuoye; public class Rect { public double width; public double height; Rect(double width,double height) //带有两个参数的构造方法,用于将width和height属性初化; { this.width=width; this.height=height; } Rect() //不带参数的构造方法,将矩形初始化为宽和高都为10. { width=10; height=

HDU 1542 Atlantis (求矩形面积并)

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of

HDU 1255 覆盖的面积 (求矩形面积的交)

覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个

相邻最大矩形面积的问题

9715 相邻最大矩形面积 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC;JAVA Description 在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个 矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同. 例如下图,图1包含的矩形的高分别为2,1,4,5,1,3,3 单位长度,矩形的宽为1单位长度. 你的任务就是计算柱状图中以X轴为底边的最大矩形的面积.

计算直方图中最大矩形面积

题目是计算直方图中的最大矩形面积,下面是我的做法,我在网上也看到有人说可以通过栈的方式来解决,因为时间问题,并没有马上尝试,下回有时间在尝试下吧!! 还有这题有变式:计算矩阵中最大的矩形面积,其中矩阵中元素只能为1和0,代码下次补发吧!! 代码如下: #include<iostream>using namespace std; int maxSquare(const int pos,const int n,const int height[]){ if(n==1) return height[

【最小矩形面积覆盖:凸包+旋转卡壳】UVA 10173 Smallest Bounding Rectangle

[最小矩形面积覆盖:凸包+旋转卡壳]UVA 10173 Smallest Bounding Rectangle 题目链接:UVA 10173 Smallest Bounding Rectangle 题目大意 给你n个点,求能够覆盖所有点集的最小矩形面积. 笔者的第2道凸包题目,凸包 + 旋转卡壳,实现点集的最小矩形面积覆盖问题 ">=0"写成"<=0"坑了我一下午!QAQ 说一下思路 ①Graham's Scan法构建凸包,时间复杂度O(nlogn) ②

hdu 1505 City Game 最大矩形面积 单调队列

City Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5106    Accepted Submission(s): 2197 Problem Description Bob is a strategy game programming specialist. In his new city building game t

[HDU 4419] Colourful Rectangle (扫描线 矩形面积并)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:比矩形面积并多了颜色,问染成的每种颜色的面积. 矩形面积并的扫描线维护的是长度,这道题就是维护每个颜色的长度,写起来很蛋疼. 1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6