01均分

来源:互联网 发布:java 字符编码转换 编辑:程序博客网 时间:2024/05/01 15:47

转载自Enockipp

题目详情:

给定一个字符串,长度不超过100,其中只包含字符0和1,并且字符0和1出现的次数都是偶数。你可以把字符串任意切分,把切分后的字符串任意分给两个人,让两个人得到的0的总个数相等,得到的1的总个数也相等。

例如,输入串是010111,我们可以把串切位01, 011,和1, 把第1段和第3段放在一起分给一个人,第二段分给另外一个人,这样每个人都得到了1个0和两个1。我们要做的是让切分的次数尽可能少。

输入是这样一个字符串,输出是最少的切分次数,保证输入合法。

注:题目一定有解,因为我们最差情况时,把字符串切分(n - 1)次形成n个长度为1的串

 

------------------------------------------------------------------------------------------------------------

假设将这个字符串的头与尾部相连接,那么构成一个字符串圆环,在这个圆环中存在这样一个规律:

必定存在这样一条直径,以这条直径将圆环分成两部分,使得这两部分的0的个数相同,且1的个数相同。

 

证明:(过程是以任一条直径开始,顺时针旋转这条直径,直到合适位置)

      因为0和1的个数都是偶数,那么设1的个数为2n,0的个数为2m;

      先以其中任一条直径将圆环分为两部分(如下图),不妨将左边的半圆成为L,右边的半圆称为R:

    

    

那么我们不妨设L中0的个数不足,1的个数超量,L和R中的0,1个数如下:    

                          0个数                      1个数    

      L中                  m-x                          n+x

      R中                 m+x                          n-x

     

    接下来我们旋转这条直径,旋转时无非下面四种情况:


 

其中第1、4种情况不会影响旋转前L和R中的0、1个数,第2、3中情况才会影响L和R中的0、1个数,那么旋转前L和R中的数字对应情况如何?

(对应指分别在一条直径的两端)

假设L中0对应R中1      即上图第3种情况  的次数为b,那么有:

        L中0对应R中0      即上图第1种情况  的次数为m-x-b,

        L中1对应R中1      即上图第4种情况  的次数为n-x-b, 

        L中1对应R中0     即上图第2种情况   的次数为2x+b

       

因为L中缺少x个0,那么 我们只要保证在旋转的过程中出现第2种情况的次数比出现第3种情况的次数多x次,就能使得L中的0、1个数分别与R中的相等,而上面我们已经推导出第二种情况存在2x+b次,第3种情况存在b次,那么在寻转过程中肯定存在“出现第2种情况的次数比出现第3种情况的次数多x次”的情况,得证。


 基于上面的规律,我们得出最多需要两刀就能将字符串均分:其中前半字符串与后半字符串的0、1个数均相等时,只需一刀;其他情况只需2刀。

0 0
原创粉丝点击