均分01

来源:互联网 发布:淘宝怎样寻找真实货源 编辑:程序博客网 时间:2024/04/29 11:10
给定一个字符串,长度不超过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;
}


0 0
原创粉丝点击