一道算法题

Posted on 2011-08-26 09:53  zl860628  阅读(160)  评论(0)    收藏  举报

[题目大概意思]

N家电影院,其中离学校的距离为D,电影票价为P,找出所有的电影院使得没有其他任意电影院比其更近票价更低。

[分析]

使用O(n2)的实现比较简单,二重循环,分别删除掉DP都不小的元素,最后剩下的就是答案。

同时可以采用分治的思想。先将整个序列按照一个指标排序,比如按照D排序。而后进行分治(归并也可以),比如进行二分,分出来的仍为相同的独立子问题,其最优解如果可以利用O(n)算法合并同时保证合并的解为最优解,那么整个算法的时间复杂度就为O(nlogn)。首先要保证每个子序列内的二元关系是满足条件的,即没有元素之间的两个属性都大于等于另一个元素(为了保证这一条,可以从两个元素开始合并,两个元素判断之间关系只需要O(1)时间)。由于是按照D降序排列,可以给两个子序列的头设置指针P1P2,当*P1>>*P2时(假定>>表示DP均不小于)*P1不属于最优解,P1指针前移;当*P1<>*P2时(假定<>表示DP其中一个不小于且另一个小于),可以默认移动P1指针,并将原*P1加入最优解中。

因为当*P1<>*P2时,有两种情况,其一是D[i]1>=D[i]2P[i]1<P[i]2,由于D[i+1]2<=D[i]2<=D[i]1P[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],两组指针都到达末尾,合并结束,形成第三列。同理可以得到最后结果第四列。

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3