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.pswp.cn/news/454833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454833.shtml
英文地址,請注明出處:http://en.pswp.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;返回此列表中指…