码迷,mamicode.com
首页 > 其他好文 > 详细

Topcoder SRM 648 Div1 250

时间:2015-02-03 09:38:17      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:数学   插空法   

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



Topcoder SRM 648 Div1 250

标签:数学   插空法   

原文地址:http://blog.csdn.net/uestc_peterpan/article/details/43417419

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!