最近两次比赛出现两道相同类型的题,有人十几分钟就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的代码:

View Code

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. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

  2. 点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部

    判断一点是否在不规则图像的内部算法,如下图是由一个个点组成的不规则图像,判断某一点是否在不规则矩形内部,先上效果图 算法实现如下,算法简单,亲试有效 public class PositionAlgo ...

  3. 判断某点在多边形内——方法二

    /* 原理: 将测试点的Y坐标与多边形的每一个点进行比较, ** 会得到测试点所在的行与多边形边的所有交点. ** 如果测试点的两边点的个数都是奇数个, ** 则该测试点在多边形内,否则在多边形外. ...

  4. 如何判断一个点在多边形内

    一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...

  5. 判断一点是否在多边形内(附Java实现代码)

    引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...

  6. 多边形碰撞检测(判断点在多边形内)

    点与规则的矩形或者等边.等腰三角形等的碰撞检测很简单,本文主要是介绍"点与多边不规则图形的碰撞检测". 如图,这个多边形已经相当复杂,包含凸和凹,该如何解决呢? 结论:使用交点数判 ...

  7. 判断点是否位于多边形内(包含凹多边形)

    如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...

  8. CorelDraw插件开发-VBA-常用功能-输出多边形内文本为文本文件-CDR插件

    文章目录 1.基本原理 2.算法实现 2.1.创建模块OutTxtInPoly 2.2.多边形判断 2.3.分图层操作 3.代码转运行 4.作者答疑   VBA是基于 Visual basic发展而来 ...

  9. CorelDraw插件开发-VBA-常用功能-输出多边形内文本为数据库文件-CDR插件

    文章目录 1.基本原理 2.算法实现 3.代码转运行 4.作者答疑   VBA是基于 Visual basic发展而来的,与VB具有相似的语言结构.从语言结构上讲,VBA是VB的一个子集,它们的语法结 ...

最新文章

  1. 解决虚拟器device support x86 but apk only supports armeabi-v7
  2. 独家 | 零售业中的惊涛骇浪——人工智能、机器学习和大数据
  3. 基于python的大数据分析实战学习笔记-pandas(数据分析包)
  4. 10.19文件管理课程笔记
  5. python按日期排序_你如何在python中获得按创建日期排序的目录列表?
  6. navicat导出数据到oracle,使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中...
  7. ios审核4.3被拒,快速通过IOS4.3问题
  8. Java Android未捕获异常处理机制
  9. gtk_widget_modify_bg的用法
  10. Springboot邮箱接口(使用个人邮箱发送邮件)
  11. Noiseware 5 降噪滤镜
  12. linux化学公式软件下载,化学公式编辑器下载-Efofex FX Chem(化学公式编辑器)下载 v3.004.0 官方特别版-IT猫扑网...
  13. 软件测试工程师工作总结
  14. 单片机与嵌入式linux 比较
  15. client-go的使用及源码分析
  16. 第二章 Silicon labs EFR32 MG21 验证蓝牙的私有Characteristic的读/写
  17. HTML将某几个文字添加下划线 并标红
  18. VSPD V9版(Virtual Serial Port Driver 9.0)
  19. 有哪些既实用又好看的蓝牙耳机?高颜值实用蓝牙耳机排行
  20. python统计分析方法

热门文章

  1. 在IIS中写Python的CGI脚本
  2. 自动化运维之PSSH
  3. MySQL性能优化的21条最佳经验【转】
  4. LAMP架构之编译安装httpd+(php-fpm)+mariadb
  5. Android中的跨进程通信方法实例及特点分析(二):ContentProvider
  6. MySQL 学习笔记 (它执行的步骤)
  7. Tools.Png.Compression
  8. Windows 8实用窍门系列:10.Windows 8的基本变换和矩阵变换以及AppBar应用程序栏
  9. C# WebBrowser document.execCommand()解析
  10. Tautology--POJ 3295