均分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;
}
例如,输入串是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;
}
相关文章推荐
- 01均分
- 均分01
- HDU1171(01背包均分问题)
- 均分01
- 英雄会 高校俱乐部 题解(均分01)
- 均分01【解】--英雄会
- 邮票分你一半 N个数最大可能均分 01背包问题
- pongo(英雄会)题解之均分01
- 均分01(from pongo)
- UVA562(01背包均分问题)
- C#学习笔记 08/01/18
- 黑马程序员_01_入门
- ACDream 1213 Matrix Multiplication (01矩阵处理)
- 【类01背包】Bottles
- activiti学习--01什么是activiti
- Java语言介绍(04)开源项目(07)项目管理工具(01)XPlanner
- Coursera 《机器学习》(Lecture 01)
- 《JSF教程》-01 认识JSF
- JavaSE_XML解析__DOM4j_解析原理01
- 01-复杂度2 Maximum Subsequence Sum