【USACO题库】3.2.2 Stringsobits__01串

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述


考虑排好序的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开头得到的方案数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值