您的位置:首页 > 其它

均分01

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

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

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

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

#include <iostream>

#include <vector>

#include <string.h>

using namespace std;

class Nums

{

public:

Nums(int a, int b)

{

numOfZero = a;

numOfOne = b;

}

int numOfZero;

int numOfOne;

};

void check(vector<Nums> &buf, int size, int pos, bool &pass, int &halfOfZero, int &halfOfOne, int &tempNumOfZero, int &tempNumOfOne)

{

if (pass)

{

return;

}

if (pos >= size)

{

if ((tempNumOfZero == halfOfZero) && (tempNumOfOne == halfOfOne))

{

cout << endl;

cout << "begin" << endl;

for (int i = 0; i < size; i++)

{

cout << buf[i].numOfZero << " : " << buf[i].numOfOne << endl;

}

pass = true;

cout << "end" << endl;

}

return;

}

tempNumOfZero += buf[pos].numOfZero;

tempNumOfOne += buf[pos].numOfOne;

if ((tempNumOfZero <= halfOfZero) && (tempNumOfOne <= halfOfOne))

{

check(buf, size, pos+1, pass, halfOfZero, halfOfOne, tempNumOfZero, tempNumOfOne);

}

tempNumOfZero -= buf[pos].numOfZero;

tempNumOfOne -= buf[pos].numOfOne;

check(buf, size, pos+1, pass, halfOfZero, halfOfOne, tempNumOfZero, tempNumOfOne);

}

void separate(string &a, vector<Nums> &buf, int len, int begin, int &halfOfZero, int &halfOfOne, int &result)

{

int size = buf.size();

if (begin >= len)

{

if (size >= result)

{

return;

}

int tempNumOfZero = 0;

int tempNumOfOne = 0;

bool checkPass = false;

check(buf, size, 0, checkPass, halfOfZero, halfOfOne, tempNumOfZero, tempNumOfOne);

if (checkPass)

{

result = size;

cout << "result " << result << endl;

cout << endl;

}

return;

}

int endPos = 1;

if (size >= result-1)

{

return;

}

if (size == result-2)

{

endPos = len-begin;

}

bool firstScan = true;

int numOfZero = 0;

int numOfOne = 0;

for (int step = len-begin; step >= endPos; step--)

{

if (firstScan)

{

for (int j = begin; j < begin+step; j++)

{

if (a[j] == '0')

{

numOfZero++;

}

else

{

numOfOne++;

}

}

firstScan = false;

}

else

{

if (a[begin+step] == '0')

{

numOfZero--;

}

else

{

numOfOne--;

}

}

if ((numOfZero > halfOfZero) || (numOfOne > halfOfOne))

{

continue;

}

buf.push_back(Nums(numOfZero, numOfOne));

separate(a, buf, len, begin+step, halfOfZero, halfOfOne, result);

buf.erase(buf.end()-1);

}

}

int fun(string s)

{

int len = s.length();

int totalOfZero = 0;

int totalOfOne = 0;

for (int i = 0; i < len; i++)

{

if (s[i] == '0')

{

totalOfZero++;

}

else

{

totalOfOne++;

}

}

int halfOfZero = totalOfZero/2;

int halfOfOne = totalOfOne/2;

vector<Nums> buf;

int result = len;

cout << "totalZero " << totalOfZero << " totalOne " << totalOfOne << endl;

separate(s, buf, len, 0, halfOfZero, halfOfOne, result);

return result;

}

int main()

{

// string s = "1001010101000111111101010101010111000110010101101001010010010010101001010010101010000100100101011010101010010101010101010101010101010101010101010101010101";

string s = "10101000100000101000000011111100011111110001000010100110";

cout << "final result " << fun(s) << endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: