pku1147 Binary codes

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1147

题意简述:初始情况下由0和1组成的序列,长度为n,做n次如下操作:把最后一个放到第一个位置来,然后从原来的第一个开始全部向后移动一个位置。这样操作后会得到一个矩形m1,将这个矩形的n行按字典序排序后形成另一个矩形m2。现给定m2的最后一列的状态,要你求出m2的第一行的状态。

解题思路:我们开始可以把m2最后一行的0和1的个数算出来,那么第一行的状态必定为:000…111,当然第一个不一定是零,也就是把0尽可能的往前面放。那么第一行的第一个数必定等于第一列的第一个数,接着我们就要把第一行的第二个数推出来:我们可以对第一行做相反移动操作,试想把第一个数移到最后去,然后其它数各向前移一位那么得到的这一行状态的第一个数必定是之前我们需要求的第二个数,这里我们必须找到新得到的状态在那个位置,以便后面继续推。假如是第一行推第二行的话,把第一行的第一个数与最后一列从第一个数的去对比,只要遇到相等的就找到了,最后一列对比好的那个数所对应的行就为所求,以此类推后面可以一样的推。对上述确定位置的方法证明一下:首先,所生成的行的最后一个数一定等于第一行(我们这先用特例说明)的第一个,至于为什么要取最先遇到的那个,可以这样看,既然第一行的字典序最小,假设第一行的第一个数是x,那么所有以x开头的行向后推出来的状态序列都比第一行推出来的状态字典序大,也就是第一行推出来的必然是以x结尾字典序最小的那一行。(证毕)同理,可以利用新得到的这一行继续推我们需要求的第三个数和第…个数,实现应该也不难了。(这题真的比较经典,需要仔细的推敲推敲,好题!!!)

代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值