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
原文地址:http://blog.csdn.net/uestc_peterpan/article/details/43417419