题目描述
考虑排好序的N(N<=31)位二进制数。
你会发现,这很有趣。因为他们是排列好的,而且包含所有可能的长度为N且含有1的个数小于等于L(L<=N)的数。
你的任务是输出第I(1<=I<=长度为N的二进制数的个数)大的,长度为N,且含有1的个数小于等于L的那个二进制数。
INPUT FORMAT
共一行,用空格分开的三个整数N,L,I。
SAMPLE INPUT (file kimbits.in)5 3 19
OUTPUT FORMAT
共一行,输出满足条件的第I大的二进制数。
SAMPLE OUTPUT (file kimbits.out)
10011
这道题很难,构思巧妙,先用dp求出所要求f[i,j]前i位1的个数不大于j的方案数,然后便是print了。
先讲一下如何计算f[i,j]。
f[i,j]表示前i位,1的个数不大于j的方案数。
显然:f[i,j]=f[i-1,j]+f[i-1,j-1]
f[i-1,j]表示当前第i位以0开头所得到的方案数,f[i-1,j-1]表示当前第i位以1开头得到的方案数。

本文详细解析了USACO竞赛中关于3.2.2 Strings on bits的题目,涵盖了字符串在位操作中的应用,包括如何使用位运算快速处理字符串信息,提高算法效率。
最低0.47元/天 解锁文章
333

被折叠的 条评论
为什么被折叠?



