BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数

Time Limit: 5 Sec  Memory Limit: 64 MB

Description

正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序。她们甚至也不能通过仍硬币的方式。 所以她们通过"round number"竞赛的方式。第一头牛选取一个整数,小于20亿。第二头牛也这样选取一个整数。如果这两个数都是 "round numbers",那么第一头牛获胜,否则第二头牛获胜。 如果一个正整数N的二进制表示中,0的个数大于或等于1的个数,那么N就被称为 "round number" 。例如,整数9,二进制表示是1001,1001 有两个'0'和两个'1'; 因此,9是一个round number。26 的二进制表示是 11010 ; 由于它有2个'0'和 3个'1',所以它不是round number。 很明显,奶牛们会花费很大精力去转换进制,从而确定谁是胜者。 Bessie 想要作弊,而且认为只要她能够知道在一个指定区间范围内的"round numbers"个数。 帮助她写一个程序,能够告诉她在一个闭区间中有多少round numbers。区间是 [start, finish],包含这两个数。 (1 <= Start < Finish <= 2,000,000,000)

Input

* Line 1: 两个用空格分开的整数,分别表示Start 和 Finish。

Output

* Line 1: Start..Finish范围内round numbers的个数

Sample Input

2 12

Sample Output

6

题解
其实我真的懒得动写题解。。。
不过这题网上做法千奇百怪。3维~5维DP都有,还有用记忆化搜索的。我实在看不下去了。这题其实两维DP+几个循环就足够了!
就是个恶心版数位DP!!!
我们设dp[i][j]为转成二进制后 前导可以为0 长度为i的串,其中零的个数为j的二进制串总个数。
很显然得到状态转移方程:dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
dp数组可以预处理得到。。。
sum(i,j)函数可以累计DP数组求出长度为i且零比一至少多j个的二进制串总个数
那么如何计算ST-ED范围内的答案?
用1...ED的答案减去1...ST-1的答案即可。(solve函数传入x即求1...二进制_x的答案)
比如计算1..110100的答案:
其中几部分是1-1,10-11,100-111,...,10000-11111
最后一部分是求100000-110100的答案
可以拆成100000-101111和110000-110011分别求解,这样就很好解决了,怎么求解还是很明显的。
由此可见求100000-110100的答案之类最后一部分的基本思想是:
从左往右扫到第i位时 当前1比0多d个 如果是此位为0跳过 如果是1则累计ans+=sum(i-1,d-1)。
大体上就是这样,不过细节恶心!
首先,若读入的数为0直接跳过,不然会无限RE。。。
其次,若读入的数转成二进制,0的个数>=1的个数则最后ans++,说明这个数本身合法。
另外还有一些起始点,边界等细节问题。
下面给出参考代码:(其实还是很短的2333)
#include<bits/stdc++.h>
using namespace std;int n,m; 
int dp[35][35];int sum(int l,int x)
{int s=0;for(int i=0;i<=l;i++)if(2*i>=l+x)s+=dp[l][i];return s;
}int solve(int x)
{int len=0,ans=0,d=1,t=x,v[35];while(t){v[++len]=t&1;t>>=1;}for(int i=1;i<len;i++)ans+=sum(i-1,1);len--;while(len){if(v[len])ans+=sum(len-1,d-1),d++; else d--;len--;}if(d<=0)ans++;return ans; 
}int main()
{for(int i=1;i<=32;i++){dp[i-1][0]=1;for(int j=1;j<=i;j++)dp[i][j]+=dp[i-1][j]+dp[i-1][j-1];}scanf("%d%d",&n,&m);if(n>2)printf("%d\n",solve(m)-solve(n-1)); else printf("%d\n",solve(m));return 0;
}

  

转载于:https://www.cnblogs.com/winmt/p/7442193.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Optimizing Code with GCC

现在的编译器越来越聪明&#xff0c;功能越来越强&#xff0c;从简单的函数内联&#xff0c;到复杂的寄存器分析&#xff0c;一系列代码革命使程序运行得越来越快。大多数时候&#xff0c;更快比更小重要&#xff0c;因为磁盘空间和内存都变得便宜了。但是在嵌入式系统里&#…

QTP的那些事--操作excel的函数

1: QTP Excel函数 操作EXCEL 数据表格 表单 编辑EXCEL 工作表 2: Dim ExcelApp As Excel.Application 3: Dim excelSheet As Excel.worksheet 4: Dim excelBook As Excel.workbook 5: Dim fso As scrīpting.FileSystemObject 6: 7: ******************…

java-生产者消费者模式

经常会有公司叫我们手撕代码&#xff0c;比如网易&#xff0c;阿里&#xff0c;那我们是不是该掌握下呢。下面这段代码来自《现代操作系统》进程与线程P49页。 public class ProducerConsumer {public ProducerConsumer() { }private static final int N 100;static Producer …

yum查询已经安装mysql_通过yum安装mysql

在linux中安装数据库首选MySQL&#xff0c;Mysql数据库的第一个版本就是发行在Linux系统上&#xff0c;其他选择还可以有postgreSQL&#xff0c;oracle等在Linux上安装mysql数据库&#xff0c;我们可以去其官网上下载mysql数据库的rpm包&#xff0c;http://dev.mysql.com/downl…

koa2-cookie-session

node.js的path.extname方法使用   由于该方法属于path模块&#xff0c;使用前需要引入path模块&#xff08;var path require(“path”) &#xff09;   接收参数&#xff1a;   p path 路径 path.extname(index.html)// returns.htmlpath.extname(index.)// returns.pat…

从程序员角度看ELF

从程序员角度看ELF原文:《 ELF:From The Programmers Perspective》作者&#xff1a;Hongjiu Lu <mailto: hjlnynexst.com>NYNEX Science & Technology, Inc. 500 Westchester Avenue White Plains, NY 10604, USA 翻译&#xff1a;alert7 <mailto: alert721cn.co…

JAVA命令符找不到符号_[转]Java命令行编译文件时出现的错误,找不到符号或软件包不存在等...

标签(空格分隔)&#xff1a; Javajavascript习惯了eclipse的自动编译&#xff0c;Java命令行编译、执行文件只会最基础的部分&#xff0c;就是对单文件的编译和执行&#xff0c;并且不包含任何外部JAR包。但有时候你还非得用命令行&#xff0c;会碰到一些问题&#xff0c;博主这…

C#中POST数据和接收的几种方式

POST方式提交数据&#xff0c;一种众所周知的方式&#xff1a; html页面中使用form表单提交&#xff0c;接收方式&#xff0c;使用Request.Form[""]或Request.QueryString[""]来获取。 这里介绍另外一种POST方式和接收方式&#xff0c;就是将整个数据作为加…

java自动注入注解_Spring自动注解标签@Autowired不能注入xml配置的bean吗?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼配置service的xmlservice代码public class LoginServiceImpl extends BaseDaoServiceImpl implements LoginService {Overridepublic Map queryByUserName(String userName){IDao iDao super.getAppDao();return (Map)iDao.queryF…

一卡通vip充值消费线上oracle库服务器故障排查过程

上图是oracle体系总架构图今天突然公司所有终端pos机不能刷卡消费&#xff0c;财务室不能充值&#xff0c;一下很多电话打过来了&#xff0c;第一反应肯定数据库出问题了&#xff0c;登陆到数据库服务器&#xff0c;果然sqlplus连进去后就不断提示要求输入用户名&#xff0c;弹…

最详细的Linux下C编程

gcc 目 录 1. gcc 1. makefile写法 2. gcc_egcs使用 3. gdb使用 4. gcc常用选项对代码的影响 1. 一般情况 2. -O 编译选项 3. -O2 编译选项 4. -fomit-frame-pointer 编译选项 5. -fomit-frame-pointer…

sqlserver 存储过程 增加

CREATE PROCEDURE [dbo].[InsertMessage]( strTable varchar(50), --表名 strValues nvarchar(1000), --要插入的数据&#xff08;用英文逗号分隔&#xff09;,如果是字符串类型&#xff0c;需加单引号 only_field varchar(20)NULL, --唯一性字段(列名) only_valu…

java开发计算机考试服务器_2011计算机二级JAVA编程:取得服务器当前的各种具体时间...

取得服务器当前的各种具体时间/*** 取得服务器当前的各种具体时间* 回车&#xff1a;日期时间*/import java.util.*;public class GetNowDate{Calendar calendar null;public GetNowDate(){calendar Calendar.getInstance();calendar.setTime(new Date());}public int getYea…

(cljs/run-at (JSVM. :all) 细说函数)

前言 作为一门函数式编程语言&#xff0c;深入了解函数的定义和使用自然是十分重要的事情&#xff0c;下面我们一起来学习吧&#xff01; 3种基础定义方法 defn 定义语法 (defn name [params*]exprs*) 示例 (defn tap [ns x](println ns x)x) fn 定义语法 (fn name? [params*]…

Request的getHeader()和getParameter()的区别

区别是&#xff1a;一个是获得HTTP头信息,一个是获得表单参数值。转载于:https://www.cnblogs.com/pxffly/p/7460514.html

gcc中的内嵌汇编语言(Intel i386平台)

gcc中的内嵌汇编语言&#xff08;Inteli386平台&#xff09; 一.声明 虽然Linux的核心代码大部分是用C语言编写的&#xff0c;但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的&#xff0c;特别是Linux的启动代码部分&#xff1b…

数据库学习,树形结构的数据库表Schema设计方案

2019独角兽企业重金招聘Python工程师标准>>> 程序设计过程中&#xff0c;我们常常用树形结构来表征某些数据的关联关系&#xff0c;如企业上下级部门、栏目结构、商品分类等等&#xff0c;通常而言&#xff0c;这些树状结构需要借助于数据库完成持久化。然而目前的各…

[转载] 手工制作Win7 OEM版

只要往微软MSDN原版ISO的sources目录加个“$OEM$”文件夹&#xff0c;再删除sources下面的ei.cfg文件就可以了。 来源&#xff1a;http://zxkh19501.blog.163.com/blog/static/1237851792010629113427594/转载于:https://www.cnblogs.com/784040932/p/win7oem.html

mysql dbo_mysql-双重分组

我的表有两列&#xff1a;名称和等级.看起来像这样&#xff1a;NAME | GRADEAdam | 1Adam | 2Adam | 2Adam | 3Frank | 2Frank | 1现在,我想创建如下所示的视图&#xff1a;NAME | GRADE 1 | GRADE 2 | GRADE 3Adam | 1 | 2 | 1Frank | 1 | 1 | 0我写了这个&#xff1a;SELECT …

课堂作业整理三 (集合:list接口)

集合中 list的方法列表&#xff08;Arraylist和Linkedlist&#xff09; 方法名功能说明ArrayList()构造方法&#xff0c;用于创建一个空的数组列表add&#xff08;E&#xff0c;e&#xff09;将指定的元素添加到此列表的尾部get&#xff08;int index&#xff09;返回此列表中指…