USACO算法系列九——kimbits
来源:互联网 发布:手机淘宝有卖家版app 编辑:程序博客网 时间:2024/05/22 03:21
题目:http://www.nocow.cn/index.php/Translate:USACO/kimbits
求出可以用<=K个1表示的长度为N的二进制串的最小的第I个数。又是01字符串,最先想到方法是遍历1~2^N-1的自然数,如果其中包含1的个数<=K个1表示,则计数加1,直到I为止。但是想想2^31次方可以表示接近2 0000000000的整数,肯定会超时的。
如果把二进制串当作二叉树的叶子节点,然后采用前序遍历的方式对二叉树进行遍历,往左边走,1的个数不变,往右边走,1的个数加1,满足条件的叶子节点,计数器加1,同时对二叉树进行剪枝。
(1)当1的个数>K的子树,可以剪枝。
(2)当K - 1的个数 >= N - 深度,证明剩下的位数可以从全0到全1排满,而此时如果 计数器 + 2 ^ (N - 深度) < I,则计数器直接+ 2 ^ (N - 深度),跳过这个子树。这一步是很关键的。
(3)如果N <= K,第I小的数为I-1
(4)如果I <= 2^K -1,则最小数为 I -1
上面四个剪枝,前两个最为关键,代码如下:
顺利通过了USACO的测试,速度还不错,测试结果如下:
- USACO算法系列九——kimbits
- USACO kimbits
- USACO/kimbits 3.2.2
- USACO 3.2 Stringsobits (kimbits)
- USACO算法系列二——fracdec
- USACO算法系列三——agrinet
- USACO算法系列四——inflate
- USACO算法系列五——rect1
- USACO算法系列六——contact
- USACO算法系列七——stamps
- USACO算法系列八——fact4
- USACO算法系列十——spin
- USACO算法系列十一——ratios
- USACO算法系列十二——msquare
- USACO算法系列十三——butter
- USACO算法系列十四——fence
- USACO算法系列十五——shoping
- USACO算法系列十六——camelot
- send,recv,sendto,recvfrom
- 上图:turbo prolog
- 联发科挑起价格战,山寨手机洗牌加速
- 如何利用python dbus来发送一个信号
- 预处理命令-条件编译
- USACO算法系列九——kimbits
- asp.net 验证码_彩色
- MySQL 创建用户的Grant命令用法
- 谈Android中GoogleMap的使用(二)
- 先安装Ubuntu再安装Window 7导致的双系统引导问题
- ZOJ 1438 Asteroids!
- 日志过滤及工具SWATCH简介
- 在胡乱点击中连到了这个网站,感觉有点爽!~
- Windows 2008, iis7, phpMyAdmin允许远程访问