Topcoder SRM 648 Div1 250

Topcoder SRM 648 Div1 250

Problem

  给一个长度为N的"AB"字符串S,S只含有两种字符'A' 或 'B',设pair(i,j)(0=<i<j<N)表示一对 i,j 使得S[i]='A',S[j]='B'。现给定一个K,求字符串S,使得pair(i,j)的个数恰好为K。若不存在,则返回空串。


Limits

Time Limit(ms): 2000

Memory Limit(MB): 256

N: [2, 50]

K: [0 , N*(N-1)/2 ]


Solution

  若K>(N/2)*(N-N/2),则不存在。其余情况均存在,用插空法求S即可。


More

  下面小证为何“若K>(N/2)*(N-N/2),则不存在”。

  考虑这样一串S:“AAA..ABBB....B”,S左边为一串“AAA...”,右边为一串"BBB..."。如果任意交换其中一对 'A','B',那么pair的总数一定会减小,所以pair总数最大的串一定是形如S的。而形如S的串中,当A的个数等于 N/2 时,pair总数最大。因此当K>(N/2)*(N-N/2)时,无解,其余情况均有解。

  当K<=(N/2)*(N-N/2),一定可以通过“插空法”找出所需S。方法如下:设S="AAA...",其中有 N/2 个 'A',现要往其中插入(N-N/2)个 ‘B’,每次可以O(1)确定当前的 'B' 插在哪一个'A' 后面,不断维护S和K即可。


Complexity

Time Complexity: O(N)

Memory Complexity: O(N)


Source

Topcoder SRM 648 Div1 250


Code

Topcoder SRM 648 Div1 250 From My Github



你可能感兴趣的:(数学,插空法)