题意(中问题直接粘吧)
矩形面积

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

思路:

      矩形不是凸出来的东西,吐出来的部分肯定是点,怎么连接边都在点连线的里面,这样就是求n*4个点的最小矩形覆盖面积,直接来个模板就行了,一开始用自己以前写的一个三分的方法来旋转角度去求,一直wa,感觉那个只能求正方形吧,这个是在网上找的,还有第一次暴栈了,记得加上外挂开战的那个东西。



#pragma comment(linker, "/STACK:1024000000,1024000000")#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>using namespace std;typedef double typev;
const double eps = 1e-8;
const int N = 50005;
int sign(double d){return d < -eps ? -1 : (d > eps);
}
struct point{typev x, y;point operator-(point d){point dd;dd.x = this->x - d.x;dd.y = this->y - d.y;return dd;}point operator+(point d){point dd;dd.x = this->x + d.x;dd.y = this->y + d.y;return dd;}
}ps[N];//int n, cn;
double dist(point d1, point d2){return sqrt(pow(d1.x - d2.x, 2.0) + pow(d1.y - d2.y, 2.0));
}
double dist2(point d1, point d2){return pow(d1.x - d2.x, 2.0) + pow(d1.y - d2.y, 2.0);
}
bool cmp(point d1, point d2){return d1.y < d2.y || (d1.y == d2.y && d1.x < d2.x);
}
//st1-->ed1叉乘st2-->ed2的值
typev xmul(point st1, point ed1, point st2, point ed2){return (ed1.x - st1.x) * (ed2.y - st2.y) - (ed1.y - st1.y) * (ed2.x - st2.x);
}
typev dmul(point st1, point ed1, point st2, point ed2){return (ed1.x - st1.x) * (ed2.x - st2.x) + (ed1.y - st1.y) * (ed2.y - st2.y);
}
//多边形类
struct poly{static const int N = 50005; //点数的最大值point ps[N+5]; //逆时针存储多边形的点,[0,pn-1]存储点int pn;  //点数poly() { pn = 0; }//加进一个点void push(point tp){ps[pn++] = tp;}//第k个位置int trim(int k){return (k+pn)%pn;}void clear(){ pn = 0; }
};
//返回含有n个点的点集ps的凸包
poly graham(point* ps, int n){sort(ps, ps + n, cmp);poly ans;if(n <= 2){for(int i = 0; i < n; i++){ans.push(ps[i]);}return ans;}ans.push(ps[0]);ans.push(ps[1]);point* tps = ans.ps;int top = -1;tps[++top] = ps[0];tps[++top] = ps[1];for(int i = 2; i < n; i++){while(top > 0 && xmul(tps[top - 1], tps[top], tps[top - 1], ps[i]) <= 0) top--;tps[++top] = ps[i];}int tmp = top;  //注意要赋值给tmp!for(int i = n - 2; i >= 0; i--){while(top > tmp && xmul(tps[top - 1], tps[top], tps[top - 1], ps[i]) <= 0) top--;tps[++top] = ps[i];}ans.pn = top;return ans;
}
//求点p到st->ed的垂足,列参数方程
point getRoot(point p, point st, point ed){point ans;double u=((ed.x-st.x)*(ed.x-st.x)+(ed.y-st.y)*(ed.y-st.y));u = ((ed.x-st.x)*(ed.x-p.x)+(ed.y-st.y)*(ed.y-p.y))/u;ans.x = u*st.x+(1-u)*ed.x;ans.y = u*st.y+(1-u)*ed.y;return ans;
}
//next为直线(st,ed)上的点,返回next沿(st,ed)右手垂直方向延伸l之后的点
point change(point st, point ed, point next, double l){point dd;dd.x = -(ed - st).y;dd.y = (ed - st).x;double len = sqrt(dd.x * dd.x + dd.y * dd.y);dd.x /= len, dd.y /= len;dd.x *= l, dd.y *= l;dd = dd + next;return dd;
}
//求含n个点的点集ps的最小面积矩形,并把结果放在ds(ds为一个长度是4的数组即可,ds中的点是逆时针的)中,并返回这个最小面积。
double getMinAreaRect(point* ps, int n, point* ds){int cn, i;double ans;point* con;poly tpoly = graham(ps, n);con = tpoly.ps;cn = tpoly.pn;if(cn <= 2){ds[0] = con[0]; ds[1] = con[1];ds[2] = con[1]; ds[3] = con[0];ans=0;}else{int  l, r, u;double tmp, len;con[cn] = con[0];ans = 1e40;l = i = 0;while(dmul(con[i], con[i+1], con[i], con[l])>= dmul(con[i], con[i+1], con[i], con[(l-1+cn)%cn])){l = (l-1+cn)%cn;}for(r=u=i = 0; i < cn; i++){while(xmul(con[i], con[i+1], con[i], con[u])<= xmul(con[i], con[i+1], con[i], con[(u+1)%cn])){u = (u+1)%cn;}while(dmul(con[i], con[i+1], con[i], con[r])<= dmul(con[i], con[i+1], con[i], con[(r+1)%cn])){r = (r+1)%cn;}while(dmul(con[i], con[i+1], con[i], con[l])>= dmul(con[i], con[i+1], con[i], con[(l+1)%cn])){l = (l+1)%cn;}tmp = dmul(con[i], con[i+1], con[i], con[r]) - dmul(con[i], con[i+1], con[i], con[l]);tmp *= xmul(con[i], con[i+1], con[i], con[u]);tmp /= dist2(con[i], con[i+1]);len = xmul(con[i], con[i+1], con[i], con[u])/dist(con[i], con[i+1]);if(sign(tmp - ans) < 0){ans = tmp;ds[0] = getRoot(con[l], con[i], con[i+1]);ds[1] = getRoot(con[r], con[i+1], con[i]);ds[2] = change(con[i], con[i+1], ds[1], len);ds[3] = change(con[i], con[i+1], ds[0], len);}}}return ans+eps;
}int main ()
{int t ,n ,i ,NN ,cas = 1;point ds[10];scanf("%d" ,&t);while(t--){scanf("%d" ,&NN);int n = 0;for(i = 1 ;i <= NN ;i ++){for(int j = 1 ;j <= 4 ;j ++){scanf("%lf %lf" ,&ps[n].x ,&ps[n].y);n++;}}double ans = getMinAreaRect(ps ,n ,ds);printf("Case #%d:\n" ,cas ++);printf("%.0lf\n" ,ans);}return 0;
}

hdu5251最小矩形覆盖相关推荐

  1. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1435  Solv ...

  2. [HNOI2007]最小矩形覆盖(旋转卡壳)

    题意 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点坐标 题解 先求得一个凸包 可以知道对于凸包每一条边,其对应一个最小矩形覆盖,而凸包整体最小矩形覆盖在这个解之 ...

  3. 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)

    传送门 题意:求最小矩阵覆盖 有这样一个结论:矩阵一定有一条边在凸包上(不会证) 那可以枚举每条边 同时旋转卡壳 只是这时不只维护一个对踵点对,同时在左右侧再维护一个最远点 可以发现左右最远点一定是和 ...

  4. 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)

    1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...

  5. Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]

    题目链接 题目大意: 就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉 解题思路: 1.首先很明显我们可以对这 ...

  6. 洛谷 P1034 矩形覆盖

    P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1​(1,11,1),p_2p2​( ...

  7. 递归和循环:跳台阶和变态跳台阶和矩形覆盖

    题目描述 跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级--它 ...

  8. 【网络流24题】最小路径覆盖问题

    [题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...

  9. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

    在讲述这两个算法之前,首先有几个概念需要明白: 二分图:  二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...

最新文章

  1. 35 利用构造函数和原型对象实现继承
  2. [环境] OpenAI gym经典控制环境CartPole-v0 介绍
  3. conky的自动启动
  4. 2021年上半年网络工程师上午真题及答案解析
  5. seay代码审计mysql插件报错_Seay源代码审计系统的配置和安装
  6. .md文件好用编辑软件分享Typora
  7. 你真的了解“无纸化办公”了吗?
  8. python 绘图函数_python绘图函数
  9. 电信光猫桥接+ML固件路由器实现ipv6网站访问
  10. Windows搭建web站点:免费内网穿透发布至公网 1-2
  11. APP-Log日志采集
  12. PLC 变频器、触摸屏综合实训平台
  13. 基于VUE-CLI实现待办事项功能
  14. 软件测试-制定测试策略
  15. LTE终端分类-LTE UE category
  16. Spring系列第10篇:primary可以解决什么问题?
  17. ROS自主导航 - 实验教学方案
  18. 在一页纸上打印8页PPT讲义的方法
  19. 安卓开发文档!花三分钟看完这篇文章你就懂了!帮你突破瓶颈
  20. 莫言系统腐化——“一坨”真的好吗?

热门文章

  1. Apache Ant自动化脚本
  2. 使用jQuery卸载绑定的事件
  3. 一个不错的git学习网站
  4. iOS实现本地通知(local notification)的方法
  5. 【挑战极限】最短AJAX创建代码
  6. Qt QDialog将窗体变为顶层窗体(activateWindow(); 和 raise() )
  7. Python进阶之一
  8. UVa 11100 旅行2007
  9. android studio 模拟器中文乱码
  10. html长文本自动换行