怎样用c++建这个问题的数学模型?
围一个圈,每个女生身旁至少坐着一个男生。也就是说,最多只能有两个女生坐在一起。这样的围圈用c++怎么去实现?如何建模?个人想了想这是个组合问题,但是思路不清晰,有大神指点...
围一个圈,每个女生身旁至少坐着一个男生。也就是说,最多只能有两个女生坐在一起。这样的围圈用c++怎么去实现?如何建模?个人想了想这是个组合问题,但是思路不清晰,有大神指点下吗??
展开
1个回答
展开全部
重点在女生,对男生没限定,但是题目没给定男女人数,那么这两个是函数参数,或者说模型输入数据。输出有两种,一种是模式判定,给定一个序列检查是否匹配要求,一种是自动排列,给定男女人数,程序自动排列。
自动排列时,可以先通过判断男女人数差,检查数据有效性,标准情况下,男女应该对等,这样正好一个挨一个,如果男生数量大于女生,肯定有效,如果允许存在全部男生的情况,女生与男生之比的下限是无限小,但如果女生大于男生,其极限是2:1,因此数据有效性就女生/男生之比<=2。
当然程序中还要考虑头尾相连时的边际检查,假设0代表女,1代表男,那么这种序列是无效的:"001110",因为头尾相连女生连续挨着3个了,考虑到这些后就可以写程序了,使用char 数组。
自动排列,给定X和Y,分别代表男生女生数量,假设女生/男生比<=2,则系统自动从男生开始排列,这样可以不用在遇到数组尾部时再去验证头部女生排列状态。循环中按照比例,每排一组男生X-n,直到X=0,然后再根据比例排一组女生,Y-m,0<=m<=2。直到X和Y均为0.
至于检查匹配就简单了,循环遍历数组,如果是女生,且女生计数为2则报错,否则计数器加1,(如果为数组尾部,检查数组头是否为连续>=2女生,是就报错),如果为男生,计数器清零。
循环正常结束返回true,报错就是返回false,随便写写,希望对你有帮助。
自动排列时,可以先通过判断男女人数差,检查数据有效性,标准情况下,男女应该对等,这样正好一个挨一个,如果男生数量大于女生,肯定有效,如果允许存在全部男生的情况,女生与男生之比的下限是无限小,但如果女生大于男生,其极限是2:1,因此数据有效性就女生/男生之比<=2。
当然程序中还要考虑头尾相连时的边际检查,假设0代表女,1代表男,那么这种序列是无效的:"001110",因为头尾相连女生连续挨着3个了,考虑到这些后就可以写程序了,使用char 数组。
自动排列,给定X和Y,分别代表男生女生数量,假设女生/男生比<=2,则系统自动从男生开始排列,这样可以不用在遇到数组尾部时再去验证头部女生排列状态。循环中按照比例,每排一组男生X-n,直到X=0,然后再根据比例排一组女生,Y-m,0<=m<=2。直到X和Y均为0.
至于检查匹配就简单了,循环遍历数组,如果是女生,且女生计数为2则报错,否则计数器加1,(如果为数组尾部,检查数组头是否为连续>=2女生,是就报错),如果为男生,计数器清零。
循环正常结束返回true,报错就是返回false,随便写写,希望对你有帮助。
更多追问追答
追问
谢谢你的思路,但我还是不明白,不过通过你的思路,我想到了,用01分别代表男女,然后再排列出2的n次方种排列方式,然后把这些排列方式存到一个2维数组中,最后逐个遍历相邻三个数,使他们相加,如果结果为3的话就删除。小弟知识尚有缺漏,望指点指点
追答
你这种方法是排列组合,而且是逐一尝试所有组合,然后将有效组合存入数组,那这个组合超大,人数越多,组合按指数级增长。
我还是用具体人数举例说明给你看。比如同样是3女2男,女=0,男=1,以下组合都是有效的
00101
01001
01010
10100
01001
10010
一共6种,但其实就是一种,因为数组中可以是6种组合,但围成圈去看其实就是一个序列,只是不同的相位。这样做一侧浪费空间浪费运算时间,二则算法冗余。
我的思路很简单,就是按照规则,首先通过男女比例剔除无效数列,而无需一个个组合去测试,因为如果女生大于男生的情况最多是2女1男的排列,超过1个女生就不符合要求了,因此女生数量除以男生数量的比极限就是2:1,比值就是2,大于2说明给定人数无效。
人数比例有效性检查
设X为男生数量,Y为女生数量
设X=2,Y=3,S=Y/X=3/2=1.5=1(人数不能为小数所以取整,不四舍五入),小于2所以参数有效。
因为男生为分母,所以男生默认为单组1个,而女生单组人数就是S。
设女生单组人数n=S=1,男生单组人数m=1
循环排列方法
排一组男生再排一组女生,如果女生用完补完全部男生(男生多的情况),每排一次,X,Y相应减去人数,当X和Y全部为0结束循环。
所有参数如下
X=2,Y=3,m=1,n=1
下面是循环排列每个步骤的结果
循环1
1 X-m=1
10 Y-n=2
循环2
101 X-m=0
1010 Y-n=1
循环3
10100 X为0不排,Y-n=0
X和Y全为0,结束。
一共3个循环,代码应该很容易写,也不用二维数组,也不用一个个尝试所有组合。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询