男孩女孩站队问题

        该问题是在http://baijiahao.baidu.com/s?id=1572912276737234&wfr=spider&for=pc上看到的,因代码写的比较优美,故在此记录一下,日后可以读一读。

问题描述:

        队伍里站着男孩、女孩,男孩用符号B表示,女孩用符号G表示,我们要把队伍调整为男孩在一边女孩在一边,并且只能相邻的位置的男孩或者是女孩交换位置,求交换次数最少是交换多少次。

        GGBBG(最初)GGBGB(交换一次)GGGBB(交换两次,并符合要求)。这样返回的结果就是2。

思路:

        首先明确一点,人家只要求求出次数,并不要求实现交换。

       显然我们要考虑男生在左侧还是女生在左侧,比如GGGGBBBG,这样的显然是女生在左侧的交换次数会更少一些。而BBBBGGB显然是男生在左侧的交换次数更少一些,所以我们都需要考虑,最后取小值即可。

        resG和resB用来记录女孩在左边和男孩在左边的两种情况的交换次数。而无论是男孩还是女孩如果他们要实现在左边,必须要看当前到已经排好的位置之间隔了几个人,因为只能相邻位置交换。lg,lb分别代表女生和男生在左边排好的位置,初始时为0。

代码:


解析:

        比如GGBBG,如果女孩在左边的话,0位置处不用交换,res=0满足,lg++,因为第0个位置已经排好了,同理如果男生要在左边的话,就得到位置2,发现位置2交换到位置0,需要交换2次,resB=2,lb++,因为如果男生要交换到左边,位置0就是已经是排好的了。

        位置1的女孩在交换到左边,就不用要求到最左边了,因为位置0已经是女生了。所以因为本身就在位置1出,交换为0,lg++后为2。同理下一个位置3上的男生也是这样,只要交换到位置1即可,交换完成后lb++。

        可见无论有没有交换次数的增加,都会使得排好的位置向右移动,用这个指标来衡量女生或者是男生交换过来的次数。

        我们最后在来看看那个排在队尾的女生,她如果要找到自己的同伴可能就需要交换了。

       位置4的女孩发现已经有两个女孩在最左边等她了,她只需要换到位置2上,用当前位置4-2就是交换次数,最终结果resG=2。

        这里需要注意,因为是lg,lb都是从0开始的。它记录的是有多少人已经符合要求了,我们下一个要交换来的人只需要交换到下一个位置即可,这样的话,因为从0开始,所以下一个位置正好就是lg,或者是lb了。

本文仅代表作者观点,不代表百度立场。系作者授权百家号发表


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值