[题目大概意思]
有N家电影院,其中离学校的距离为D,电影票价为P,找出所有的电影院使得没有其他任意电影院比其更近票价更低。
[分析]
使用O(n2)的实现比较简单,二重循环,分别删除掉D和P都不小的元素,最后剩下的就是答案。
同时可以采用分治的思想。先将整个序列按照一个指标排序,比如按照D排序。而后进行分治(归并也可以),比如进行二分,分出来的仍为相同的独立子问题,其最优解如果可以利用O(n)算法合并同时保证合并的解为最优解,那么整个算法的时间复杂度就为O(nlogn)。首先要保证每个子序列内的二元关系是满足条件的,即没有元素之间的两个属性都大于等于另一个元素(为了保证这一条,可以从两个元素开始合并,两个元素判断之间关系只需要O(1)时间)。由于是按照D降序排列,可以给两个子序列的头设置指针P1和P2,当*P1>>*P2时(假定>>表示D和P均不小于)*P1不属于最优解,P1指针前移;当*P1<>*P2时(假定<>表示D或P其中一个不小于且另一个小于),可以默认移动P1指针,并将原*P1加入最优解中。
因为当*P1<>*P2时,有两种情况,其一是D[i]1>=D[i]2且P[i]1<P[i]2,由于D[i+1]2<=D[i]2<=D[i]1,P[i+1]2>=P[i]2>P[i]1,说明序列1最优解的元素并不会被序列2后面的元素证明其不是最优解。同理第二种情况也可以证明。最终算法复杂度为排序复杂度O(nlogn)+归并复杂度O(nlogn),仍为O(nlogn)。
[例子]
|
1,20 |
1,20 |
1,20 |
1,20 |
|
5,10 |
5,10 |
5,10 |
5,10 |
|
8,15 |
8,15 |
11,26 |
12,3 |
|
9,24 |
11,26 |
12,3 |
|
|
11,26 |
12,3 |
||
|
12,3 |
首先按照第一个元素排序,而后两两分组进行归并,对每组内的两个元素进行最优化,得到第二列。而后进行组和组的合并。指针指向[1,20]和[8,15],两个相容,移动第一组的指针,而后发现[5,10]与[8,15]不相容,应删除[8,15],两组指针都到达末尾,合并结束,形成第三列。同理可以得到最后结果第四列。
浙公网安备 33010602011771号