分治策略
分治法,又叫分治策略,顾名思义,分而治之。它的基本思想为:对于难以直接解决的规模较大的问题,把它分解成若干个能直接解决的相互独立的子问题,递归求出各子问题的解,再合并子问题的解,得到原问题的解。通过减少问题的规模,逐步求解,能够明显降低解决问题的复杂度。
能使用分治法解决的问题,它们一般具备以下几个特征:
①该问题可以分解成若干相互独立、规模较小的相同子问题;
②子问题缩小到一定的程度能轻易得到解;
③子问题的解合并后,能得到原问题的解;分治法在信息学竞赛中应用非常广泛,使用分治策略能生成一些常用的算法和数据结构,如快排、最优二叉树、线段树等;
还可以直接使用分治策略,解决一些规模很大、无法直接下手的问题。
分治的三步骤
①分解:将要解决的问题分解成若干个规模较小的同类子问题;
②解决:当子问题划分得足够小时,求解出子问题的解。
③合并:将子问题的解逐层合并成原问题的解。
在划分问题时,可以采用递归法,把一个大问题逐步分解成规模较小的子问题,直至可以直接求出子问题的解;再将子问题逐层合并,返回到顶层,得到原问题的解。根据分治法的划分原则,把原问题划分成多少个子问题才适合呢?各个子问题的规模应该多大才适合呢?一般来说,每次划分成2个子问题,每个子问题的规模差不多最合适。合并解时要因题而异,有些问题递归分解完能直接得到原问题的解,有些问题需逐层合并,得到原问题的解
首先我们学习二分思想
【例1】最大数和最小数
【问题描述】给你n(n<=100000)个整数,要求你求出其中的最大数和最小数。
【文件输入】共计两行:第一行为一个整数n,第二行为n个整数,均不超过200000000。
【文件输出】输出只有一行最大数和最小数,用一个空格分开。
【样例输入】