均分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的串。
例如,输入串是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; }
相关文章推荐
- 均分01(from pongo)
- UVA562(01背包均分问题)
- HDU1171(01背包均分问题)
- 01均分
- 均分01
- pongo(英雄会)题解之均分01
- 均分01【解】--英雄会
- 均分01
- 英雄会 高校俱乐部 题解(均分01)
- 邮票分你一半 N个数最大可能均分 01背包问题
- 红帽企业版6.0 KVM虚拟化实战攻略01
- 01背包水题篇之HDU3466——Proud Merchants
- 设计模式学习01—单例模式
- 【Spark你妈喊你回家吃饭-01】 Spark是什么鬼?
- 企业级搜索elasticsearch应用01-单机安装和索引文档操作
- [转载] 杜拉拉升职记——01 忠诚源于满足
- hdu 1864最大报销额 (01背包模板)
- ADO.NET基础01(ADO.NET组成,数据库的方式,SqlCommand,SqlDataReader)
- Java基础01Java开发入门
- 01-其他对象API(System类)123 02-其他对象API(Runtime类) 03-其他对象API(Math类)