pku1147 Binary codes - ccsu_001的专栏 - 博客频道 - CSDN.NET

原题链接:Binary codes(poj/pku1147) ?
文章价值(3) ?
阅读数(130) ?

题目链接: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结尾字典序最小的那一行。(证毕)同理,可以利用新得到的这一行继续推我们需要求的第三个数和第…个数,实现应该也不难了。(这题真的比较经典,需要仔细的推敲推敲,好题!!!)

代码:

版权声明:本文为博主原创文章,未经博主允许不得转载。





(注:此网站文章大都来自公开的博客,如有原作者发现有侵权问题,请在此留言,我们会立刻删除相关文章。)

我的评价: