User Tools

Site Tools


exam3

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
exam3 [2012/04/14 09:26] – [2107] xcyanexam3 [2012/04/14 12:56] (current) – [2108] xcyan
Line 39: Line 39:
 ==== 2108 ==== ==== 2108 ====
 这道题目就是N路合并问题,如果不知道什么是N路合并,可以考虑N=2的情形。 这道题目就是N路合并问题,如果不知道什么是N路合并,可以考虑N=2的情形。
 +
 两个有序队列做合并,数据结构课里面应该讲过怎么做吧。现在我们将N扩大,然后就是N个有序队列做合并。 两个有序队列做合并,数据结构课里面应该讲过怎么做吧。现在我们将N扩大,然后就是N个有序队列做合并。
  
 +"配对I" 这个题有2种做法 by 蒋舜宁:
 +
 +  - N路归并。先将A,B排序,考虑A[i]+B[j], j=1..N这个数列,对于每一个i都有一个N个数的有序数列,我们选取当前剩下的序列头中最小的那个,自然就是当前最小的一对。然后这就成了一个N路归并的问题。如果没法一下子想清楚,就画个图试试看吧,N行,每行N个数,每次比较这N行的头,然后把选了的那个头划掉,划N次。
 +  
 +  - 二分答案套二分查找。我们发现,我们可以把第N大的数找出来。事实上,如果我们知道了一个数T,就可以算出比他小的有多少个,这个通过排序A,B,枚举每个i,然后二分得到B[j]<=T-A[i]的个数,再加起来,就可以搞出来,这一步的复杂度是kNlogN,k是个常数(<32)。最后,我们可以用算出来的答案ret,还原最后一次二分:再枚举i=1到N,将所有A[i]+B[j]<=ret的扔进数组,排序输出即可。
 +上述两种方法都可以通过此题。
exam3.1334395600.txt.gz · Last modified: 2012/04/14 09:26 by xcyan

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki