BCZM : 1.7
光影切割
在一个平面内有一个矩形区域,直线穿过矩形可以将其分割为不同的区域,且在这个平面中不存在三条直线相交一点的情况。求当有N条直线穿过矩形时,它被分割为多少个区域?
解法一:
      平面倍划分成多少块的问题可以转化为直线的交点有多少个的问题。
      两条直线-->一个交点-->空间分成4个部分
      三条直线-->两个交点-->空间分成6个部分
      三条直线-->三个交点-->空间分成7个部分
每增加一条直线,如果增加M个交点,那么这条直线被新增加的M个交点,分成M+1段。每一段直线会将原来一块区域分成两块,因此,新增加M+1块新区域。
如果总共有N条直线,M个交点,那么区域的数目为N+M+1。如何证明?将N条直线逐一投影到坐标区间上,假设第K条直线与之前的K-1条直线的焦点为Nk个,那么它使得区间内的区域块增加Nk+1个。则N条直线投影完毕后,所有区域块的数目为:
      1+sigma(Nk+1)(1-->n)=1+N+sigma(Nk)(1-->n)=1+N+M
因此,求出所有直线两两相交的交点,然后再查找落在区间内的交点,就可以计算出划分的区域块数。将所有交点存储于数组Intersect中,然后计算。这样,算法的复杂度就转化为查找交点数组的问题了。
数组初始化,即计算所有交点,时间复杂度为O(N^2)。每次查询的时间复杂度为O(M)。
    如果在初始化后对所有交点按X轴坐标排序,则复杂度为O(N^2+M*logM),之后进行二分查找,每次查找的时间复杂度为O(logM)。
解法二:
      一个交点的情况,两条直线与左边界的交点顺序为(a,b),与右边界的交点顺序为(b,a),顺序反过来了。如果没有交点,则顺序不变。
      区域内的交点数目等于一个边界上交点顺序相对另一个边界交点顺序的逆序总数(利用到条件“没有三条直线相交于一个点”)。
问题转化为求一个N个元素数组的逆序数。
求解逆序数的直接方法时间复杂度为O(N^2),若用分治策略,可降为O(N*logN)。分治思想如下:求前N/2个元素的逆序数,再求后N/2个元素的逆序数,最后在排序过程中合并前后两部分之间的逆序数。
https://blog.csdn.net/lonelycatcher/article/details/7907333
BCZM : 1.7的更多相关文章
- BCZM: Chapter 2
		
2.1 二进制数中 1 的个数 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 分析与解法 解法1:利用十进制和 ...
 - BCZM: Chapter 1
		
1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...
 - BCZM : 2.1
		
1.问题描述 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 2.分析与解法 解法1:利用十进制和二进制相互转化 ...
 - BCZM : 1.16
		
24点游戏 解法一:穷举法 解法二:分治法
 - BCZM : 1.15
		
数独 解法一:广度优先搜索. 解法二:先填满中间矩阵,其他区域通过矩阵置换求出.
 - BCZM : 1.9
		
有n个学生参加见面会,分别对m个研究组中的若干个感兴趣,为了满足所有学生的要求,每个学生都能参加自己感兴趣的见面会,如果每个见面会的时间为t,如何安排才能使得所有见面会的总时间最短? 分析: 先建立模 ...
 - BCZM : 1.8
		
问题: 所有的员工均在1楼进电梯的时候,选择所要到达的楼层.然后计算出停靠的楼层i,当到达楼层i的时候,电梯停止.所有人走出电梯,步行到所在的楼层中.求所有人爬的楼层数目和的最小值. 解法一 ...
 - BCZM : 1.6
		
https://blog.csdn.net/kabini/article/details/2311946 题目大意: 水房能容纳饮料的总量是V,有一批饮料,每种饮料单个容量都是2的方幂,每种饮料信息如 ...
 - BCZM : 1.5
		
https://blog.csdn.net/zs634134578/article/details/18046317 有很多服务器存储数据,假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿 ...
 
随机推荐
- JS:面向对象(基础篇)
			
面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念.long long ago,js是没有类的概念(ES6推出了class,但其原理还是基于原型),但是它是基于原 ...
 - python调用tushare获取A股上市公司管理层人员信息
			
接口:stk_managers 描述:获取上市公司管理层 注:tushare模块下载和安装教程,请查阅我之前的文章 积分:用户需要2000积分才可以调取,具体请参阅本文最下方积分获取办法 输入参数 名 ...
 - js模块化的历史
			
了解模块化开发的历史,可以帮助我们理解 模块化开发的形式是怎么样的,对我们深入学习模块化开发会有很大的帮助: 一.服务器端JS的模块化 nodeJS的出现 ------官网: http://nod ...
 - python读取文件报错:pandas.errors.ParserError: iterator should return strings, not bytes (did you open the file in text mode?)
			
python 读取csv文件报错问题 import csv with open('E:/Selenium2script/DDT模块/test.csv','rb') as f: readers = cs ...
 - Python中两大神器&exec() &eval()
			
一.神器1 -- 内置函数eval eval是python中的内置函数,它的作用是将字符串变为所对应的表达式,也相当于一个功能代码加双引号变为字符串,而eval又将字符串转为相应的功能,它在使用过程中 ...
 - Kettle 中的循环
			
说道循环,小伙伴们肯定不陌生,就是重复干一件事:而kettle中的循环一般是发生在job中,因为job是串行执行的: kettle的循环有两种,一种是通过js脚本,另外一种是通过遍历前面步骤返回的每一 ...
 - BCZM: Chapter 1
			
1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...
 - 解析Mybatis入门第一天
			
MyBatis是一个基于Java的持久层框架,内部对JDBC做了封装,使开发者只需要关注SQL语句,而不用关注JDBC的代码,使开发变得更加的简单. MyBatis通过XML或者注解的方式将要执行的各 ...
 - wordpress添加视频弹窗插件Video PopUp
			
Video PopUp 给外部div 添加class类名:class="main-play" a链接添加 class="vp-a" 测试链接地址:https: ...
 - Thinkphp 3.2 去掉index.php
			
1.httpd.conf中去掉LoadModule rewrite_module modules/mod_rewrite.so 前面的#号 2.httpd.conf 中 AllowOverride ...