您的位置:首页 > 其它

均分01

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

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

考虑到最差情况,则是把字符串切分(n - 1)次形成n个长度为1的串。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
char* str = "010000111011"; //"0101"
int i = 0;
int len = strlen(str);

//记录分割位的数组
int *index = calloc(sizeof(int), len);
for (i = 0; i < len; i++) {
index[i] = 0;
}

i = 0;
//统计0/1各出现总次数
int count[2] = { 0 };
while (*(str + i) != '\0') {
count[*(str + i++) - '0']++;
}

//0/1出现次数
int n0 = 0, n1 = 0;
int lastId = 0;
i = 0;
while (*(str + i) != '\0') {
if (*(str + i) == '0') {
//0到达一半,1未到一半,记录分割点
if (n0 == count[0] / 2 && n1 != count[1] / 2) {
n0 = 0;
n1 = 0;
index[i - 1] = 1;
continue;
} else {
n0++;
}
} else if (*(str + i) == '1') {
//与0的情况同理
if (n0 != count[0] / 2 && n1 == count[1] / 2) {
n0 = 0;
n1 = 0;
index[i - 1] = 1;
continue;
} else {
n1++;
}
}
//刚好满足
if (n0 == count[0] / 2 && n1 == count[1] / 2) {
index[i] = 1;
lastId = i;
break;
}
i++;
}

int begin = 0;
for (i = 0; i < len; i++) {
if (index[i]) {
//第一个分割点不是最后分割点,即有2个以上分割点
if (!begin && i != lastId) {
begin = i;
break;
}
}
}

//分情况输出
if (!begin) {
printf("preson 1:\n");
for (i = begin; i <= lastId; i++) {
printf("%3c", *(str + i));
}
printf("\nperson 2:\n");
for (i = lastId + 1; i < len; i++) {
printf("%3c", *(str + i));
}
} else {
printf("preson 1:\n");
for (i = 0; i <= begin; i++) {
printf("%3c", *(str + i));
}
printf(",");
for (i = lastId + 1; i < len; i++) {
printf("%3c", *(str + i));
}
printf("\npreson 2:\n");
for (i = begin + 1; i <= lastId; i++) {
printf("%3c", *(str + i));
}
}
return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: