关于多边形内点数问题的一些变形
最近两次比赛出现两道相同类型的题,有人十几分钟就AC了,而有人卡了俩小时。。。反思。。
先说hdu4353这道题,题意是要求一个从N个点1里边画出一个多边形来,然后给出M个点2。让这个(多边形的面积/多边形内点2的个数)最小。
描述很复杂。。。但是仔细想想会发现,多边形的点越多,面积也就越大,所以,这里只能画三个点,也就是一个三角形。至于怎么求点2的个数,这是很有必要总结的,祭奠我那苦逼的俩小时吧。。。。
先看一个图:
这不是立体图,仅仅是个平面图。。。
假设sum[i][j]表示i,j这条线上方这块区域的点的数目
可以看到三角形内点2的数目 = sum[i][j] + sum[j][k] - sum[i][k];
其实更通用一点就是: abs(sum[i][k] - sum[i][j] - sum[j][k]);
既然统计出这些点数来,这个问题基本就解决了。
HDU 4353的代码:
const int N = 210; const int M = 511;struct Point {int x, y;bool operator < (const Point& cmp) const {return x < cmp.x;} };Point a[N], b[M]; int sum[N][N]; int n, m;inline int det(int x1, int y1, int x2, int y2) {return x1*y2 - x2*y1; }inline int cross(Point a, Point b, Point c) {return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y); }int main() {//freopen("data.in", "r", stdin);int i, j, k, t, cas = 0, cnt;double ans, area;scanf("%d", &t);while(t--) {scanf("%d%d", &n, &m);REP(i, n) scanf("%d%d", &a[i].x, &a[i].y);REP(i, m) scanf("%d%d", &b[i].x, &b[i].y);sort(a, a + n);for(i = 0; i < n; ++i) {for(j = i + 1; j < n; ++j) {sum[i][j] = 0;for(k = 0; k < m; ++k) {if(b[k].x >= a[i].x && b[k].x < a[j].x) {if(cross(a[i], a[j], b[k]) > 0) sum[i][j]++;}}}}ans = -1;for(i = 0; i < n; ++i) {for(j = i + 1; j < n; ++j) {for(k = j + 1; k < n; ++k) {cnt = sum[i][k] - sum[i][j] - sum[j][k];if(cnt == 0) continue;area = double(cross(a[i], a[j], a[k]))/2;if(ans == -1 || fabs(area/cnt) < ans) ans = fabs(area/cnt);}}}if(ans == -1) printf("Case #%d: -1\n", ++cas);else printf("Case #%d: %.6lf\n", ++cas, ans);}return 0; }
还有一个就是多校9上的1001题(HDU 4380)。比上面这个题更直白,需要统计三角形内的点数是不是奇数就可以。。。
转载于:https://www.cnblogs.com/vongang/archive/2012/08/22/2650887.html
关于多边形内点数问题的一些变形相关推荐
- 判断点是否处于多边形内的三种方法(转)
1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...
- 点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部
判断一点是否在不规则图像的内部算法,如下图是由一个个点组成的不规则图像,判断某一点是否在不规则矩形内部,先上效果图 算法实现如下,算法简单,亲试有效 public class PositionAlgo ...
- 判断某点在多边形内——方法二
/* 原理: 将测试点的Y坐标与多边形的每一个点进行比较, ** 会得到测试点所在的行与多边形边的所有交点. ** 如果测试点的两边点的个数都是奇数个, ** 则该测试点在多边形内,否则在多边形外. ...
- 如何判断一个点在多边形内
一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...
- 判断一点是否在多边形内(附Java实现代码)
引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...
- 多边形碰撞检测(判断点在多边形内)
点与规则的矩形或者等边.等腰三角形等的碰撞检测很简单,本文主要是介绍"点与多边不规则图形的碰撞检测". 如图,这个多边形已经相当复杂,包含凸和凹,该如何解决呢? 结论:使用交点数判 ...
- 判断点是否位于多边形内(包含凹多边形)
如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...
- CorelDraw插件开发-VBA-常用功能-输出多边形内文本为文本文件-CDR插件
文章目录 1.基本原理 2.算法实现 2.1.创建模块OutTxtInPoly 2.2.多边形判断 2.3.分图层操作 3.代码转运行 4.作者答疑 VBA是基于 Visual basic发展而来 ...
- CorelDraw插件开发-VBA-常用功能-输出多边形内文本为数据库文件-CDR插件
文章目录 1.基本原理 2.算法实现 3.代码转运行 4.作者答疑 VBA是基于 Visual basic发展而来的,与VB具有相似的语言结构.从语言结构上讲,VBA是VB的一个子集,它们的语法结 ...
最新文章
- 解决虚拟器device support x86 but apk only supports armeabi-v7
- 独家 | 零售业中的惊涛骇浪——人工智能、机器学习和大数据
- 基于python的大数据分析实战学习笔记-pandas(数据分析包)
- 10.19文件管理课程笔记
- python按日期排序_你如何在python中获得按创建日期排序的目录列表?
- navicat导出数据到oracle,使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中...
- ios审核4.3被拒,快速通过IOS4.3问题
- Java Android未捕获异常处理机制
- gtk_widget_modify_bg的用法
- Springboot邮箱接口(使用个人邮箱发送邮件)
- Noiseware 5 降噪滤镜
- linux化学公式软件下载,化学公式编辑器下载-Efofex FX Chem(化学公式编辑器)下载 v3.004.0 官方特别版-IT猫扑网...
- 软件测试工程师工作总结
- 单片机与嵌入式linux 比较
- client-go的使用及源码分析
- 第二章 Silicon labs EFR32 MG21 验证蓝牙的私有Characteristic的读/写
- HTML将某几个文字添加下划线 并标红
- VSPD V9版(Virtual Serial Port Driver 9.0)
- 有哪些既实用又好看的蓝牙耳机?高颜值实用蓝牙耳机排行
- python统计分析方法
热门文章
- 在IIS中写Python的CGI脚本
- 自动化运维之PSSH
- MySQL性能优化的21条最佳经验【转】
- LAMP架构之编译安装httpd+(php-fpm)+mariadb
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
- MySQL 学习笔记 (它执行的步骤)
- Tools.Png.Compression
- Windows 8实用窍门系列:10.Windows 8的基本变换和矩阵变换以及AppBar应用程序栏
- C# WebBrowser document.execCommand()解析
- Tautology--POJ 3295