算法合集之《浅谈信息学竞赛中的区间问题》
算法合集之《浅谈信息学竞赛中的区间问题》
浅谈信息学竞赛中的区间问题华东师大二附中周小博【摘要】本文对一些常用的区间问题模型做了简单介绍,包括一些算法及其正确性的证明,并从国际、国内的信息学竞赛与大学生程序设计竞赛中选了近10道相关例题,进行简要分析。
【关键字】区间模型转化贪心动态规划优化在信息学竞赛中,有很多问题最终都能转化为区间问题:例如从若干个区间中选出一些满足一定条件的区间、将各个区间分配到一些资源中、或者将一些区间以某种顺序放置等。
这类问题变化繁多,解法各异,需要用到贪心、动态规划等算法,并可以用一些数据结构优化算法。
本文将从几个方面对区间问题做一个简单的介绍,给出一些算法及其正确性的证明,具体分如下几个方面进行讨论:1.最大区间调度问题2.多个资源的调度问题3.有最终期限的区间调度问题4.最小区间覆盖问题5.带权区间调度、覆盖问题6.区间和点的有关问题我们将对上述每个问题都给出基本模型、算法、证明及其实现,并从ACM-ICPC、CEOI、CTSC等比赛中选出了近10道相关例题,进行简要分析,有的例题还给出了各种不同的算法及其时间效率的分析。
本文中所讨论的问题主要由两个部分组成,一部分为近几年来各类竞赛题的归纳总结,另一部分来自于参考文献。
数轴上有n 个区间,选出最多的区间,使得这些区间不互相重叠。
算法:将所有区间按右端点坐标从小到大排序,顺序处理每个区间。
如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。
证明:显然,该算法最后选出的区间不互相重叠,下面证明所选出区间的数量是最多的。
设i f 为该算法所接受的第i 个区间的右端点坐标,i g 为某最优解中的第i 个区间的右端点坐标。
命题1.1 当1≥i 时,该算法所接受的第i 个区间的右端点坐标i f ≤某最优解中的第i 个区间的右端点坐标i g 。
该命题可以运用数学归纳法来证明。
对于1=i ,命题显然为真,因为算法第一个选择的区间拥有最小右端点坐标。
令1>i ,假定论断对1-i 为真,即11--≤i i g f 。
算法合集之《信息学竞赛中概率问题求解初探》
f ( )( x
i 1 i
Байду номын сангаас
n
i
xi 1 ) A | 而不
管ξ i 的取值,我们就称函数 f 在[a,b]上可积,称 A 为函数 f 在[a,b]上的定积分,记为
b
a
f ( x) dx 。一个实用的结论是:任意连续函数在任意闭区间上都是可积的。
Newton-Leibniz 公式: 设连续函数 f 在[a,b]上有定义, 则
k 1
k
p k | 存在,则
称
x
k 1
k
pk 为 X 的数学期望,简称期望,记为 E(X)。
1.3.2 连续型随机变量的数学期望 设连续型随机变量 X 的概率密度函数为 f(x),若广义积分
| xf ( x ) | dx 收敛,则称
xf ( x)dx 为连续型随机变量 X 的数学期望,记为 E(X)。
x
f (t ) dt ,则称 X 为连续型随
机变量,称 f(x)为 X 的概率密度函数。要注意,概率密度不是概率。常见的连续型随机变
2
IOI2009 冬令营论文 梅诗珂 量分布有均匀分布,正态分布,指数分布。 1.2.2.1 连续型随机向量及其概率分布 如果 X1,X2,…,XN 都是连续型随机变量,则称(X1,X2,…,XN)为 N 维随机向量,其概率 分 布 函 数 为 F(x1,x2, … ,xN)=P{X1 ≤ x1,X2 ≤ x2, … ,XN ≤ xN} 。 若 存 在 非 负 可 积 函 数 f(x1,x2,…,xN)使得 F ( x1 , x2 ,..., x N )
D
信息学竞赛中常见的论问题与算法
信息学竞赛中常见的论问题与算法信息学竞赛是计算机科学与技术领域的重要竞赛形式,旨在培养学生的计算思维、算法设计和程序编写能力。
在竞赛中,常见的论问题与算法是非常重要的知识点。
本文将介绍信息学竞赛中常见的论问题及其解决算法。
一、最短路径问题在信息学竞赛中,最短路径问题是经常出现的一类论问题。
其基本思想是在给定的图结构中,寻找从起点到终点的最短路径。
1. Dijkstra算法Dijkstra算法是最短路径问题中常用的解决算法之一。
它采用贪心策略,从起点开始逐步扩展最短路径集合,直到找到终点或者所有路径都找到为止。
2. Floyd-Warshall算法Floyd-Warshall算法是解决最短路径问题的另一种经典算法。
它采用动态规划的思想,通过迭代更新矩阵来寻找最短路径。
二、最小生成树问题最小生成树问题是指在一个连通图中,找到一个生成树,使得树的边权值之和最小。
1. Prim算法Prim算法是解决最小生成树问题的典型算法之一。
它从一个起点开始,逐步添加边,直到所有的节点都被覆盖,形成最小生成树。
2. Kruskal算法Kruskal算法是另一种常用的最小生成树算法。
它将所有边按照权值从小到大排序,逐步添加边,同时保证不形成环,直到所有节点都被覆盖。
三、动态规划问题动态规划是一种常见的问题求解方法,通过将复杂问题分解成一系列重叠子问题,并将其结果储存起来,以避免重复计算,从而提高算法的效率。
1. 背包问题背包问题是一个经典的动态规划问题,在信息学竞赛中也经常出现。
其基本思想是,在给定的背包容量和一组物品的重量、价值情况下,选择物品将其放入背包中,以获得最大的总价值。
2. 最长上升子序列问题最长上升子序列问题是求解一个序列中满足严格递增条件的最长子序列的长度。
通过动态规划求解,可以获得最优解。
四、图论问题图论是信息学竞赛中常用的一种数据结构,常见的图论问题有最短路径、最小生成树等。
1. 拓扑排序拓扑排序是一种对有向无环图进行排序的算法。
2021 海淀区信息学奥赛 区间划分
2021 海淀区信息学奥赛区间划分一、引言区间划分是计算机科学中一个重要的概念,它在算法设计和分析、数据结构以及动态规划等领域中有着广泛的应用。
2021年海淀区信息学奥赛的题目中涉及到了区间划分,这个主题既是计算机科学的重点内容,也是考生们需要深入理解和掌握的知识点。
本文将从简到繁,由浅入深地探讨2021海淀区信息学奥赛的区间划分主题,帮助读者更全面、深入地理解这一概念。
二、区间划分的基本概念在计算机科学中,区间通常指一段连续的数据集合,区间划分就是将给定的区间划分成若干个不相交的子区间,一般要求这些子区间的并等于原区间,并且它们的交为空集。
在算法设计和分析中,区间划分常常与贪心算法、动态规划等经典的算法思想结合,用来解决各种实际问题,比如区间调度、区间覆盖等。
区间划分的基本概念包括区间端点、区间长度、区间的覆盖等,这些概念都是理解区间划分题目的重要基础。
三、2021海淀区信息学奥赛中的区间划分题目在2021年海淀区信息学奥赛中,区间划分题目的具体内容可能涉及到一些关于区间长度、区间权值、区间覆盖等方面的问题。
举一个简单的例子,题目可能是给定一个长度为n的区间,每个位置上都有一个权值,现在需要将这个区间划分成m个子区间,要求每个子区间的权值之和尽量大。
这样的题目既考察了对区间划分基本概念的理解,又考验了解决实际问题的能力。
这类题目对参赛者的综合能力提出了更高的要求。
四、如何解决区间划分题目解决区间划分题目,一般可以采用贪心算法、动态规划等经典的算法思想。
在贪心算法中,常常需要根据题目的特定要求设计合适的区间划分策略,以使得每次划分能够最大化某种指标。
而在动态规划中,需要建立合适的状态转移方程,然后利用动态规划算法求解。
这些方法都需要对区间划分的特点加以分析和把握,要灵活运用各种算法思想来解决题目中的具体问题。
五、个人观点和理解区间划分是我的文章写手,编程解决问题时经常用到的一个重要概念。
在我看来,区间划分不仅是一种算法思想,更是对问题分解和综合能力的考验。
算法合集之《浅谈信息学竞赛中的“0”和“1”》
算法合集之《浅谈信息学竞赛中的“0”和“1”》信息学竞赛,作为一项高智商、高技能的竞赛项目,一直备受关注。
在这项比赛中,算法的设计和实现是关键的考察内容之一、而在算法设计过程中,经常会遇到数字“0”和“1”的处理问题,本文将对信息学竞赛中的“0”和“1”进行浅谈。
首先,我们先来思考一下,为什么会在信息学竞赛中频繁地遇到“0”和“1”。
事实上,信息学竞赛中的问题通常是围绕着计算机和计算机科学展开的,而计算机是一种二进制的设备,只能识别“0”和“1”。
因此,在算法设计中,经常会遇到需要将问题转化为二进制数字的形式来处理的情况。
其次,我们来看看在具体的算法设计中,常见的“0”和“1”相关的问题。
首先,是位运算问题。
计算机底层的操作是基于位的运算,包括与、或、非、异或等操作,这些操作往往会涉及到“0”和“1”的位运算。
在信息学竞赛中,对二进制数字的位运算能力是很重要的,比如二进制的与、或、非等操作可以用来解决一些特定的问题,比如位运算求解整数的奇偶性、判断是否是2的幂等等。
其次,是01背包问题。
背包问题是算法设计中经典的问题之一,而01背包问题是其中的一种形式。
在01背包问题中,我们需要选择一些物品放入背包中,每个物品有一定的价值和重量,同时背包有一定的容量限制,要求在不超过容量限制的情况下,如何选择物品放入背包中使得总价值最大。
在求解01背包问题中,我们往往需要使用到二进制的“0”和“1”表示物品的选择情况。
再次,是二进制。
二进制是一种高效的方法,其基本思想是通过对范围的二分缩小,从而有效地减少的时间复杂度。
而在二进制中,通常会使用到二进制的“0”和“1”来表示的状态,比如在二分查找中,我们通过比较中间位置的值和目标值的大小关系,确定是继续左半部分还是右半部分。
最后,还有一种经典的问题,即哈密顿路径问题。
在哈密顿路径问题中,我们需要在一个有向图中找到一条路径,使得这条路径依次经过图中的每个顶点,且每个顶点只能经过一次。
算法合集之《浅析信息学竞赛中一类与物理有关问题》
6 5
4
称与左右两边都不连通的容器为独立的
利用独立容器水压与气压的平衡 直接算出独立容器最终的水位 只需考虑容器独立前水位是如何变化的
一类特殊情况
不妨先研究一类简单的情况 大胆提出限制:管子的高度递增 这种情况下容器间更容易封住
一类特殊情况
一类特殊情况
从左到右对每个容器进行处理 总复杂度O(N) 特殊情况解决
从特殊到一般
大胆进行类比,引入块的概念
一个块是一段连续的容器 这段容器间的管子高度递减
从特殊到一般
这样定义块的原因
块内水位上升规律明显 块与块之间容易密封
一般情况的解决
块水位变化的规律
与右边的块密封前的规律
一般情况的解决
块水位变化的规律
与右边的块密封后的规律
一般情况的解决
从左到右依次对块进行处理 复杂度分析
总结
回顾例题并参考其它这类的问题 这类问题对我们的要求与培养:
有创造力,勤于实践 理性与感性相结合 思维的多样性和严谨性 灵活应对问题,看清本质 深入研究,举一反三 耐心,永不放弃的品质
死胡同 算法1 算法2 算法3
算法N
[例]water tanks(ACM 2007 Final改编)
有许多高低不同的圆柱型 容器由一些高低不同的横 向的管道连接
最多能倒多少体积的水 气压变化法则P1V1=P2V2 同一水平面水压处处相等 规模:容器数N<1000000
对样例的解释
高度H1
次数依然有O(N),模拟也要O(N) 依然无法承受
初步分析
初步分析
抓住问题特征
只要求倒的水量 最终第一个容器的水柱高度是固定的 最终水压只由该容器水柱高度决定 分别考虑各个容器
信息学竞赛中的算法与数据结构讲解教案
信息学竞赛中的算法与数据结构讲解教案一、引言信息学竞赛是一种基于计算机科学和数学的竞争形式,其中算法与数据结构是竞赛中最为核心和关键的内容之一。
本教案将详细讲解信息学竞赛中常用的算法和数据结构,并提供相关示例和题目,以帮助学生深入理解和掌握这些知识点。
二、算法1. 算法的概念算法是一系列解决问题的步骤或方法。
在信息学竞赛中,算法常被用于解决各种问题,如排序、查找、图遍历等。
掌握不同类型的算法对于竞赛成绩的提升至关重要。
2. 常见算法类型及其应用(1)排序算法:- 冒泡排序:通过相邻元素的比较和交换来实现排序。
- 快速排序:通过选择一个基准元素将数组分为两部分,一部分小于基准元素,一部分大于基准元素,再分别对两部分递归排序。
- 归并排序:将数组分为若干个子数组,分别对子数组进行排序,然后再依次合并得到有序数组。
这些排序算法在竞赛中经常用到,学生需要了解它们的原理和实现。
(2)查找算法:- 二分查找:针对有序数组,在每次查找过程中将查找范围缩小一半,直到找到目标元素或查找范围为空。
- 哈希表查找:通过将目标元素映射到一个固定位置来进行查找,具有较快的查找速度。
(3)图算法:- 图的遍历:深度优先遍历(DFS)和广度优先遍历(BFS)是图的常用遍历方法。
DFS通过递归或栈实现,BFS通过队列实现。
- 最短路径算法:迪杰斯特拉算法和弗洛伊德算法分别用于求解单源最短路径和多源最短路径问题。
3. 算法示例(1)示例一:冒泡排序给定一个整数数组,按照从小到大的顺序进行冒泡排序。
```cppvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {swap(arr[j], arr[j+1]);}}}}```(2)示例二:二分查找给定一个有序整数数组和一个目标值,使用二分查找算法返回目标值在数组中的下标(如果不存在则返回-1)。
国家集训队论文:浅谈信息学竞赛中的“0”和“1”
01
树状数组中 的每一个元 素的编号变 成了二制
02
编码,再通过 这些二进制编 码末尾的0的 个数来
03
决定存储什 么信息,假 设节点编号 为x,那么这
04
个节点存储 数据的区间 为2k(其中 k为x二进制
05
末尾0 的个 数)个元素 。
06
又由于每个十进制 数转化成二进制位 的话,1的个数最 多只有O(logN)个, 所以,复杂度只有 O(logN)。
2k:X and –X
具体操作:
1 插入或删除: While
2 查询: While x>0
x<=max do
do
Begin
Begin
C[x]:=c[x]+ delta;
Sum:=sum+ c[x];
X:=x+(x and –x);
X:=x-(x and –x);
End;
End;
单击添加标题
Add a title
•模型转化 Add a title
•01二叉树
例题一: Matrix
有一个M*N的矩阵,每一 个格子中的数是1或0,初 始时为0。有两种操作:
修改一个子矩阵, 将子矩阵中的数字 全部01取反。
查询第x行第y列的 格子中的数字。
01
02
如果给定的是一 个长度为N的一 排格子。
从而达到转十为二,事半功倍的效果!
欢迎提问~
Thank You!
每次询问的时候只 需计算出Sumx就可 以 求出第x个格子被修 改过几次。
查询
01 寻根溯源
02
用上面的方法看 看能否解决原来 的问题。
推而广之
怎么办呢???
算法合集之《浅谈信息学竞赛中的区间问题》
问题转化为:在一些带权区间中,选出一 部分,使它们覆盖[M,E]上的所有整数点, 求权和最小值。
算法:按右端点坐标排序,做动态规划
状态:f[i]=覆盖[M,T2i]的权和最小值 方程:
Min
f i 1 ji
f [ j] | T 2 j 1 T1i
Si
定义区间集合深度d为包含任意一点的区间 数量的最大值
至少需要d个资源 算法1: 计算出d 按左端点坐标排序 依次将区间任意地分配到d个资源中
实现
记录每个资源的最大右端点
O(nd)
用二叉堆维护这些坐标
O(nlogd)
算法2:
计算d(也可以不用计算) 按右端点坐标排序 每个区间都分配到右端点坐标最大的可用
5.带权区间调度、覆盖问题
例题:USACO 2005 dec silver
仓库从第M秒到第E秒的任意时刻都 需要有人打扫。有N个工人,每人 给出自己的工作时间段:从第T1秒 到第T2秒,需要支付工资S元。
录用一部分人,要保证从M秒到第E 秒的任意时刻都得有人打扫,问最 少要付多少工资。
转化
资源中。
平衡二叉树O(nlogd)
3.有最终期限的区间调度问题
有n个长度固定、但位置可变的区间,将它 们全部放置在[0,+∞)上。每个区间有两
个已知参数:长度ti和最终期限di,设fi为 其右端点坐标。定义
li
fi
0
di
if
fi di
L
max
1in
li
if fi di
放置所有区间,使它们不互相重叠且最大 延迟L最小。
NOIP算法:三类基于贪心思想的区间覆盖问题
of this representation should be written in the output file in acceding order. We say that
the intervals [a; b] and [c; d] are in ascending order if, and only if a <= b < c <= d.
In each line should be written a description of one interval. It should be composed of two
integers, separated by a single space, the beginning and the end of the interval
intervals. In the (i+1)
- st line, 1 <= i <= n, there is a description of the interval [ai; bi]
in the form of two integers ai and bi separated by a single space, which are respectively
the beginning and the end of the interval,1 <= ai <= bi <= 1000000.
Output
The output should contain descriptions of all computed pairwise non
- intersecting intervals.
writes the computed intervals in ascending order into std output
初探数位dp
题目链接:http://www.spoj.pl/problems/SORTBIT
or /vjudge/problem/viewProblem.action?id=18852
题目大意:参照论文。 分析:参照论文。
……
Conclusion
算法合集之《浅谈数位类统计问题》——刘聪 /billdu/item/c749952ab2ab5 0c2ef10f137
Hdu2089
题目链接: /showproblem.php?pid=208 9 题目大意:给定区间[n,m],求在n到m中没有“62“或 “4“的数的个数。 如62315包含62,88914包含4,这两个数都是不合法的。 0<n<=m<1000000
Hdu3652
决策第i位:
for x = 0 ~ 9 if k = 1 //要求要包含13 f[i,j,k,l] = f[i - 1,x,1,(l - j*10^(i-1))%13];
if j = 1 and x = 3 //已经有13了。
f[i,j,k,l] = f[i,j,k,l] + f[i - 1,x,0,(l - j*10^(i-1))%13]; else //不要求包含13 if not (j = 1 and x = 3) f[i,j,k,l] = f[i - 1,x,0,(l - j*10^(i-1))%13];
Hdu2089
如f[2,6]的转移 6? ? = 0,1,2,3,4,5,6,7,8,9 f[2,6] = sum(f[1,j]) j = ?
Hdu2089
信息学竞赛中问题求解常见题分析(一)
信息学竞赛中问题求解常见题分析(一)逻辑推理问题问题求解是信息学竞赛初赛中常见题型,它共两题,每题5分,共10分。
诸如寻找假币、博弈原理、抽屉原理、容斥问题、排列组合、逻辑推理、递推关系等问题出现在问题求解中。
逻辑推理问题通常把只涉及一些相互的关联条件或关系,极少给出数量关系与几何图形的一类非常规数学问题叫逻辑推理问题。
处理这类问题,要从一些关联的条件出发,应用某些数学知识,甚至日常生活常识,依据一定的思维规律(机智灵活、准确敏捷的思考),通过分析、推理、排除不可能情况(剔除不合理成分),然后作出正确的判断。
逻辑推理问题中常用到以下三条逻辑基本规律:(1)同一律:是指同一东西(对象),它是什么就是什么,不能模棱两可,亦此亦彼;(2)矛盾律:是指互相对立(矛盾)的事不能都真,二者必有一假(即同一思想不能既真又假);(3)排中律:是指两个不相容的判断不能都假,二者必有一真(即任何判断或同一思想不能既不真也不假)。
逻辑推理问题条件扑朔迷离,层次重叠纷纭,没有一定的定理可以依据,无现成公式可用,无模式可循,靠的是逻辑推理。
可画框图,紧抓关系,细抠条件,寻找突破口,穷追到底,层层进逼,以求找到答案。
本文结合一些赛题,谈谈处理逻辑推理问题的一些主要方法。
一、利用逻辑原理,直接推理对于一些简单的逻辑推理问题,往往只需以似真推理为主,直接通过分析就可以得出正确的结果。
用这种方法解决“真假话”问题尤为有效。
例1.住在某个旅馆的同一房间的四个人A,B,C,D正在听一组流行音乐,他们当中有一个人在修指甲,一个人在写信,一个人躺在床上,一个人在看书。
1.A不在修指甲,也不在看书;2.B不躺在床上,也不在修指甲;3.如果A不躺在床上,那么D不在修指甲;4.C既不在看书,也不在修指甲;5.D不在看书,也不躺在床上。
她们各自在做什么呢?解:由1,2,4,5知,既不是A,B在修指甲,也不是C在修指甲,因此修指甲的应该是D;但这与3的结论相矛盾,所以3的前提肯定不成立,即A应该是躺在床上;在4中C既不看书又不修指甲,由前面分析,C又不可能躺在床上,所以C是在写信;而B则是在看书。
算法合集之《浅谈信息学竞赛中的“0”和“1”》
例题三:Requirements
第 10 页 共 29 页
给定 N(1 <= N <= 100000)个五维的点 A( x1, x2, x3, x4 , x5 ) ,求两个 点 X ( x1 , x2 , x3 , x 4 , x5 ) 和 Y ( y1 , y 2 , y3 , y 4 , y 5 ) ,使得他们的哈密顿距离(即
第 5 页 共 29 页
Suma , b 相比以前会增加 2,答案是 Suma , b mod 2,结果不受影响,这个
更改是正确的。 当 (a, b )属于第 8 个区域时, Suma, b 会受到 ( x1 , y1 ), ( x1 , y 2 + 1) 的 影响 ,
Suma, b 相比以前会增加 2,答案是 Suma, b mod 2,结果不受影响,这个
� 第三步 那么二维的可以解决,三维的呢?N 维的呢? 根据上面的方法,我们不难想到,如果是三维的话,应该在长方 体的周围加入 8 个点,N 维的情况,应该在 N 维图形周围加入 2 n 个点 来处理这些情况。统计 Sumi , i ..., i 即可。
1 2
n
� 第四步 这道题的方法我们已经很明确了,要用到数据结构来解决,但是 用线段树等数据结构的话,如果推广到二维或者三维,可能写起来就 相当复杂,并且出错的概率相当大,那么有没有一个写起来既简单快 捷又易推广的数据结构呢?树状数组! ! !
分析: 根据这个题目中介绍的这个矩阵中的数的特点不是 1 就是 0,这 样我们只需记录每个格子改变过几次,即可判断这个格子的数字。
� 第一步 我们不妨把这道题目简化一下, 假定题目中给定的是长度为 N 的 一列格子 d 。
第 2 页 共 29 页
算法合集之《浅谈数位类统计问题》
题目大意: 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整
数次幂之和。例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 24+20, 18 = 24+21, 20 = 24+22。
第 4 页,共 12 页
浅谈数位类问题
刘聪
【例题 4】Tickets (sgu 390)
题目大意: 有一位售票员给乘客售票。对于每位乘客,他会卖出多张连续的票,直到已卖出的票的
编号的数位之和不小于给定的正数 k。然后他会按照相同的规则给下一位乘客售票。初始时, 售票员持有的票的编号是从 L 到 R 的连续整数。请你求出,售票员可以售票给多少位乘客。
剩下的问题就是,如何统计一棵高度为 i 的完全二叉树内二进制表示中恰好含有 j 个 1 的数的个数。这很容易用递推求出:设 f[i,j]表示所求,则分别统计左右子树内符合条件数的 个数,有 f[i,j]=f[i-1,j]+f[i-1,j-1]。
这样,我们就得出了询问的算法:首先预处理 f,然后对于输入 n,我们在假想的完全 二叉树中,从根走到 n 所在的叶子,每次向右转时统计左子树内数的个数。下面是 C++代码: void init()//预处理f {
【例题 3】Sequence (spoj 2319)
题目大意: 给定所有 K 位二进制数:0,1,…,2K-1。你需要将它们分成恰好 M 组,每组都是原序列
中连续的一些数。设 Si(1 ≤ i ≤ M)表示第 i 组中所有数的二进制表示中 1 的个数,S 等于所有 Si 中的最大值。你的任务是令 S 最小。
算法合集之《论数学策略在信息学问题中的应用》
论数学策略在信息学问题中的应用(北京十二中, 杨江明, 100071)【关键字】策略可扩展性效率整数问题【摘要】本文研究的是,在信息学竞赛中十分重要,却常常被忽略的数学策略。
本文通过分析数学策略中的方程思想、不等式思想及构造法在具体问题中的应用,比较他们同其他策略的优劣,较为详细地介绍了数学策略的效率、应用范围以及可扩展性。
并总结了在信息学问题中引入数学策略的原因。
引申出如何在一般解题过程中应用数学策略。
展望了数学策略在今后信息学竞赛中应用的前景。
本文所选的例题都是近年来各级信息学竞赛的试题,针对某些题目提出了区别于标准算法的更高效的数学策略解法,具有很强的现实意义【目录】【关键字】【摘要】【目录】【正文】§1. 数学与策略§2. 数学策略在信息学题目中的应用§2.1 数学策略之方程思想——化简、解决题目的途径§2.1.1 方程思想的运用§2.1.2 运用方程思想同一般策略的比较§2.2 数学策略之不等式——抽象与具体的桥梁§2.2.1 不等式的应用§2.2.2 应用不等式同一般策略的比较§2.3 特殊的问题——构造法——到达想象力的尽头§2.3.1 构造法的应用§2.3.2 构造法同其它策略的比较§3. 为什么应用数学策略——小结数学策略的应用【附录】【参考书目】【源程序】【正文】§1. 数学与策略数学,是研究现实世界的空间形式和数量关系的科学,是处理客观问题的强有力的工具,几乎在一切自然科学领域中都起着基础性的作用。
策略,是指解决问题所采取的方法。
它包括解决各种问题及问题的方方面面的方法。
本文讨论的策略,是指利用计算机编程解题时所采取的行之有效的方法,即编程策略。
编写程序解决问题常见的策略有:数学(规律)策略,分治策略,贪心策略,穷举(含搜索)策略等等。
判断某种策略的优劣,通常都从三方面进行考察:效率:也就是我们所说的算法复杂度。
深入分析区间型动态规划
深入分析区间型动态规划郑州市第九中学张旭祥区间型动态规划在信息学竞赛中应用甚广,它是动态规划中的经典问题,最小代价字母树是这类动态规划最经典的体现,对于初学者而言这类动态规划并不太好理解。
于是,区间型动态规划又成了动态规划中的难点问题。
下面,本文将为大家深入分析区间型动态规划的思想及其程序的实现,希望能对大家有所帮助。
历届大赛中区间型动态规划题目的考查。
区间型动态规划是各大信息竞赛出题的热点,具体体现在以下题目:1.合并石子----NOI19952.能量项链---NOIP20063.加分二叉树----NOIP20034.最优排序二叉树---- CTSC96这些题目出现的频次及其所在比赛的重要性足以说明区间型动态规划在各类动态规划中有着举足轻重的地位。
二、区间型动态规划的算法分析在这里就以经典的最小代价字母树作为例子,对区间型动态规划的算法进行分析。
问题描述:给定一个序列,如4、1、2、3我们将他们相加进行合并,最终合并成一个数,每次相加的代价是两个加数的和,求怎样的相加顺序可以使总代价最小。
很多初学者认为这类动态规划不易理解,其重要原因是这类动态规划与其他动态规划的思想不大相同,而初学者又是利用其他动态规划的思想来解决这类动态规划,从而进入了思维误区。
这种错误的思维模式一旦建立便很难重新建立正确的解题思想,从而陷入绝境。
这类动态规划正确的解法是这样的:首先,根据动态规划无后效性的性质可以想到:对于一个序列:A1、A2……An,假如最后相加的两个数是第一个数到第i个数的和S[1--i]以及第i+1个数到第n个数的和S[i+1--n],另外,对于第一个数到第i个数相加的最小代价是F[1,i]以及从第i+1到第n个数相加的最小代价为F[i+1,n],则总代价即为F[i+1,n]+F[1,i](前面相加的最小代价)+ S[1--i]+ S[i+1--n](最后一次相加的最小代价)。
由此,我们可以清楚的看出要想求出总代价的最小值只要枚举i的位置,使得F[i+1,n]+F[1,i] + S[1--i]+ S[i+1--n]的和最小即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈信息学竞赛中的区间问题华东师大二附中周小博【摘要】本文对一些常用的区间问题模型做了简单介绍,包括一些算法及其正确性的证明,并从国际、国内的信息学竞赛与大学生程序设计竞赛中选了近10道相关例题,进行简要分析。
【关键字】区间模型转化贪心动态规划优化在信息学竞赛中,有很多问题最终都能转化为区间问题:例如从若干个区间中选出一些满足一定条件的区间、将各个区间分配到一些资源中、或者将一些区间以某种顺序放置等。
这类问题变化繁多,解法各异,需要用到贪心、动态规划等算法,并可以用一些数据结构优化算法。
本文将从几个方面对区间问题做一个简单的介绍,给出一些算法及其正确性的证明,具体分如下几个方面进行讨论:1.最大区间调度问题2.多个资源的调度问题3.有最终期限的区间调度问题4.最小区间覆盖问题5.带权区间调度、覆盖问题6.区间和点的有关问题我们将对上述每个问题都给出基本模型、算法、证明及其实现,并从ACM-ICPC、CEOI、CTSC等比赛中选出了近10道相关例题,进行简要分析,有的例题还给出了各种不同的算法及其时间效率的分析。
本文中所讨论的问题主要由两个部分组成,一部分为近几年来各类竞赛题的归纳总结,另一部分来自于参考文献。
1.最大区间调度问题数轴上有n 个区间,选出最多的区间,使得这些区间不互相重叠。
算法:将所有区间按右端点坐标从小到大排序,顺序处理每个区间。
如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。
证明:显然,该算法最后选出的区间不互相重叠,下面证明所选出区间的数量是最多的。
设i f 为该算法所接受的第i 个区间的右端点坐标,i g 为某最优解中的第i 个区间的右端点坐标。
命题1.1 当1≥i 时,该算法所接受的第i 个区间的右端点坐标i f ≤某最优解中的第i 个区间的右端点坐标i g 。
该命题可以运用数学归纳法来证明。
对于1=i ,命题显然为真,因为算法第一个选择的区间拥有最小右端点坐标。
令1>i ,假定论断对1-i 为真,即11--≤i i g f 。
则最优解的第i 个可选区间所组成的集合包含于执行该算法时第i 个可选区间所组成的集合;而当算法选择第i 个区间时,选的是在可选区间中右端点坐标最小的一个,所以有i i g f ≤。
证毕。
设该算法选出了k 个区间,而最优解选出了m 个区间。
命题1.2 最优解选出的区间数量m =该算法选出的区间数量k 。
假设k m >,根据命题1.1,有k k g f ≤。
由于k m >,必然存在某区间,在kg 之后开始,故也在k f 之后开始。
而该算法一定不会在选了第k 个区间后停止,还会选择更多的区间,产生矛盾。
所以km≤,又因为m是最优解选出区间个数,所以km=。
综上所述,算法选出的区间是最优解。
实现:在判断某个区间与当前已选的所有区间是否重叠时,可以直接判断是否和所选的最后一个区间是否重叠。
时间复杂度:排序()nO log。
nnO=()nO log+扫描()n例题1:Latin America - South America 2001 Problem A题目大意:基因是由许多外显子(exon)组成,每个外显子都有一个起始位置和一个结束位置。
两个外显子能够互相联接必须满足某个外显子的起始位置在另一个外显子的结束位置之后。
给出()<nn个外显子,要求找到一条由外显子组成0<1000的基因链,使得外显子数量最多。
分析:将每个外显子看作一个区间,两端点坐标分别为外显子的起始、结束位置。
则现在的问题和原问题基本相同,只是端点上也不能重叠。
这里就不写算法了。
2.多个资源的调度问题有n个区间和无限多的资源,每个资源上的区间之间不互相重叠。
将每个区间都分配到某个资源中,使用到的资源数量最小。
定义区间集合深度d为包含任意一点的区间数量的最大值,则显然有:命题2.1 需要的资源数至少为d。
设区间1I ,2I ,…,d I 全部包含某一点,则必须把这些区间分配到不同资源中,故至少需要d 个资源。
其实竞赛中也出现过计算区间集合深度的题目,如North America – Northeast 2003 Problem E 。
下面给出计算区间集合深度的算法。
d的计算方法:将每个区间拆成两个事件点,按坐标从小到大排序,顺序处理每个区间。
记录一个值t ,表示当前点被包含次数。
每次遇到区间的左端点就+1,遇到右端点就-1。
d 的值就是在该过程中t 的最大值。
注意两个相同坐标不同类型的事件点的位置关系和区间是否能在端点处重叠有关,这在排序过程中应该注意。
时间复杂度为排序()n n O log +扫描()n O =()n n O log由此可得出一个构造算法。
算法1:计算出d 。
将所有区间按左端点坐标从小到大排序,顺序处理每个区间。
处理某个区间时,排除在它前面且与之重叠的区间所用到的资源,然后在1,2,3,…,d 这些资源中任意分配一个未被排除的资源。
证明:设排序后的n 个区间分别为1I ,2I ,…,n I命题2.2 每个区间都能分配到一个资源。
考虑任何一个区间j I ,假设存在t 个区间在它前面且与之重叠。
一定有d t ≤+1,否则由于这1+t 个区间都包含j I 的起始时刻,与d 的定义矛盾。
故有1-≤d t ,从而在d 个资源中至少有一个资源没被这t 个区间排除。
所以对于每个区间,都至少有一个可分配资源。
证毕。
命题2.3 没有两个互相重叠的区间被分配到了同一个资源。
考虑任意两个互相重叠的区间1j I 、2j I ,其中21j j <。
当算法在处理区间2j I 时,区间1j I 所用资源已经被排除,所以不会被分配到同一资源。
综上所述,该算法可以成功的构造出正好使用d 个资源的一组解,而根据命题2.1,所用资源的下限是d ,故该解是用到资源数量最少的解。
实现:区间分配资源时,如果直接做排除,则时间复杂度为()2n O ,当然可以通过记录每个资源的最大右端点坐标以将时间复杂度降为()nd O ;由于可以每次找一个最大右端点坐标最小的资源,故可以用一个优先队列来储存每个资源的最大右端点坐标。
用二叉堆实现该优先队列,每次查找最小值的时间复杂度为()1O ,修改关键字的时间复杂度为()d O log ,分配资源操作的时间复杂度也就降为()d n O log 。
故总时间复杂度为:d 的计算()n n O l o g +排序()n n O l o g +分配资源()d n O l o g =()()nd n O log 。
其实这里可以不计算出d ,而通过不断地增加资源数量来使所有区间都能分配到资源。
该算法同时也证明了以下命题:命题2.4 用到的资源数量的最小值为区间集合深度d 。
基于这个命题,我们很容易想到另外一种算法。
算法2:计算d 。
将所有区间按右端点坐标从小到大排序,顺序处理每个区间。
对于每个区间,都在1,2,3,…,d 这些资源中分配一个可用的且右端点坐标最大的资源。
证明:显然每个资源上的区间都不互相重叠,下面证明每个区间都能分配到一个可用资源。
用一个元素个数为d 的有序表i S (表中元素始终从小到大排序),记录处理i 个区间后,各个资源的最大右端点坐标(当某个资源从没被用过时,可认为值为∞-)。
同样用表i S '表示处理i 个区间后,某最优解的状态(根据命题2.5,该表中元素个数也是d )。
状态i S '不优于i S 状态指[][]j S j S d j i i '≤≤≤∀,1。
命题2.5 处理完第()1≥i i 个区间后,某最优解此时的状态i S '不优于运行该算法后此时的状态i S 。
该命题可以运用数学归纳法来证明。
对于1=i ,命题显然为真,因为第一个区间无论分配哪个资源,状态都是一样的。
令1>i ,假定论断对1-i 为真,即[][]j S j S d j i i 11,1--'≤≤≤∀。
设处理第i 个区间时,该算法分配的资源是[]11j S i -,在最优解中分配的资源为[]21j S i -。
设第i 个区间的右端点坐标为[]i e 。
表i S 更新为:[][][][][][][]()i e d S j S j S j S S S i i i i i i ,1,,2,1,1,,2,1111111111-⋯++-⋯------; 表i S '更新为:[][][][][][][]()i e d S j S j S j S S S i i i i i i ,1,,2,1,1,,2,1121212111-'⋯+'+'-'⋯''------。
而该算法分配的资源[]11j S i -在所有可分配资源中拥用最大右端点坐标,故区间i 的左端点坐标小于[]111+-j S i ,又[][]111111+'≤+--j S j S i i ,所以12j j ≤。
⑴当21j j <≤时:[][][][]j S j S j S j S i i i i '='≤=--11;⑵当12j j j <≤时:[][][][][]j S j S j S j S j S i i i i i '=+'≤'≤=---1111;⑶当d j j <≤1时:[][][][]j S j S j S j S i i i i '=+'≤+=--1111; ⑷当d j =时:[][][]i e j S j S i i ='=。
所以有[][]j S j S d j i i '≤≤≤∀,1,证毕。
命题2.6 每个区间都能分配到一个资源。
处理第i 个区间时,状态可用1-i S 表示。
最优解肯定能给该区间分配到资源,设为[]01j S i -'。
根据命题2.5,[][]0101j S j S i i --'≤。
则运行该算法时,至少可以给该区间分配资源[]01j S i -。
证毕。
综上所述,该算法可以成功的构造出正好使用d 个资源的一组解,而根据命题2.1所用资源的下限是d ,故该解是用到资源数量最少的解。
实现:考虑如何分配资源。
如果直接记录每个资源的最大右端点坐标,时间复杂度为()nd O 。
可以用证明中所提到的有序表,用一个平衡二叉树来维护它。
每次处理某个区间时,可以在()d O log 时间内找到合适资源,并在()d O log 时间内修改该资源结束时间。
这样做的总时间复杂度也是()()nd n O log 。
第一个构造算法证明了最少所用资源的数量,并用编程复杂度较低的方法构造出了可行解。
第二个贪心算法是基于第一个算法的结论得到的,编程复杂度也比第一种高,然而利用它的局部最优性,还可以附加更多的条件。