HDU4734——2013 ACM/ICPC Asia Regional Chengdu Online
今天做的比赛,和队友都有轻微被虐的赶脚。
诶,我做的题就是这个题目了。
题目描述就是对于一个十进制数数位上的每一位当做一个二进制位来求出这个数,这个定义为G(x)。
题目给定你A和B,求在0-B范围内有多少个数x满足G(x)<=G(A)。
这个题目显然是个数位DP哦。可惜我在比赛的时候琢磨了好久才弄出来,诶,深坑队友啊。
这个题目给定的时间比较紧,只有500ms,但是数据也不强,只有10^9。
其实最最重要的优化(也是dp的一部分)就是预处理数组f[i][j](表示i位数构成的值的G函数值为j的种类数)
这样很显然很容易可以得到f[i]和f[i+1]的递推关系呢。
同时由于给定的范围只有10^9,所以对于i,我们只要处理到8就可以咯。你懂的。
同时我们可以先算一下,最大的那个数99999999(8个9)所对应的G函数的值(我算好像不过万吧)这样复杂度完全可以闭着眼睛承受。
于是在求的时候也是用的最最经典的数位DP的求法,这里就不详细说了,新手多刷几个水题就弄明白了。
其实这个题目最最关键的就是我刚刚说的这个预处理,但是这个预处理还是不够的,还要预处理f[i][j]的前缀和。
我们可以用sum[i][j]表示f[i][0]~f[i][j]的和,因为每次我们dp的时候要加的是那个和,所以有了这个预处理我们可以直接调用咯,还不怕数据大,每次都是一样的。
下面上我的代码吧,比赛的时候写的,代码有点乱,希望神犇不要喷我……
#include <iostream>
#include <cstring>
#define ll long long
#define maxn 10000
using namespace std; ll a[],b[],c[],A,B,t,na,nb,f[][maxn],ans,sum[][maxn],cas=; int main()
{
for (ll i=; i<; i++) c[i]=(<<i);
memset(f,,sizeof f);
memset(sum,,sizeof sum);
for (ll i=; i<; i++) f[][i]=;
for (ll i=; i<=; i++)
{
for (ll k=; k<maxn; k++)
{
if (f[i-][k]==) continue;
for (ll j=; j<; j++)
f[i][k+j*c[i-]]+=f[i-][k];
}
}
/*for (ll i=1; i<=5; i++)
{
for (ll j=0; j<=5; j++) cout<<f[i][j]<<' '; cout<<endl;
}*/
for (ll i=; i<=; i++)
{
sum[i][]=;
for (ll j=; j<maxn; j++) sum[i][j]=sum[i][j-]+f[i][j];
}
/*cout<<endl;
for (ll i=1; i<=5; i++)
{
for (ll j=0; j<=5; j++) cout<<sum[i][j]<<' '; cout<<endl;
}*/
cin>>t;
while (t--)
{
cin>>A>>B;
ans=na=nb=;
memset(a,,sizeof a);
memset(b,,sizeof b);
while (A) a[++na]=A%,A/=;
while (B) b[++nb]=B%,B/=;
for (ll i=; i<na; i++) a[i+]+=a[i]/,a[i]%=;
while (a[na]>) a[na+]=a[na]/,a[na]%=,na++;
/*for (ll i=na; i>0; i--) cout<<a[i]; cout<<endl;
for (ll i=nb; i>0; i--) cout<<b[i]; cout<<endl;*/
A=;
for (ll i=; i<=na; i++) A+=a[i]*c[i-];
for (ll i=nb; i>; i--)
{
for (ll j=; j<b[i]; j++)
if (A-j*c[i-]>=) ans+=sum[i-][A-j*c[i-]];
else break;
A-=b[i]*c[i-];
if (A<) break;
}
for (ll i=; i<=b[]; i++)
if (A>=i) ans++;
cout<<"Case #"<<++cas<<": "<<ans<<endl;
}
return;
}
HDU4734——2013 ACM/ICPC Asia Regional Chengdu Online的更多相关文章
- 2013 ACM/ICPC Asia Regional Chengdu Online 1004 Minimum palindrome
Minimum palindrome Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 2013 ACM/ICPC Asia Regional Chengdu Online---1003
哈哈哈 #include <iostream> #include <cstring> #include <string> #include <cstdio&g ...
- 2013 ACM/ICPC Asia Regional Chengdu Online hdu4731 Minimum palindrome
Minimum palindrome Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4729 An Easy Problem for Elfness(主席树)(2013 ACM/ICPC Asia Regional Chengdu Online)
Problem Description Pfctgeorge is totally a tall rich and handsome guy. He plans to build a huge wat ...
- HDU 4735 Little Wish~ lyrical step~(DLX搜索)(2013 ACM/ICPC Asia Regional Chengdu Online)
Description N children are living in a tree with exactly N nodes, on each node there lies either a b ...
- hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...
- hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...
- hduoj 4715 Difference Between Primes 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Time Limit: 2000/1000 MS (J ...
- hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...
随机推荐
- 什么是 CI/CD?(翻译)
CI/CD是什么? 原文:https://opensource.com/article/18/8/what-cicd 在谈论软件开发时,经常会提到持续集成Continuous Integration( ...
- Jenkins +svn +maven +tomcat+ ansible 自动化批量部署
Jenkins +svn +maven +tomcat+ ansible 自动化批量部署 一.部署svn yum install subversion 先创建目录 mkdir /home/svn 创建 ...
- WinForm 捕获系统关机、重启、注销事件
Public Class App Public Shared Sub Main() ' 关联事件 AddHandler Microsoft.Win32.SystemEvents.SessionEndi ...
- 虚拟机下安装cad2006和南方cass7.0
本人电脑是win10系统,装了一个cad2014,cad2014没有与之匹配的cass版本,但cad2014也有用途,于是上网找两个cad版本都安装的教程,发现一个比较好的办法就是安装虚拟机,在虚拟机 ...
- Linux系统下搭建FTP/SFTP服务器
传输文件经常使用ftp和sftp服务器.Windows下有多种可视化工具,使用快捷.Linux经常需要自行搭建这两种服务器,当然搭建熟练的话,会更加快捷. 1.检查Linux系统是否安装了vsftp和 ...
- Influxdb配置文件详解---influxdb.conf
官方介绍:https://docs.influxdata.com/influxdb/v1.2/administration/config/ 全局配置 1 2 reporting-disabled = ...
- VirtualBox共享文件夹 Windows 7 (宿主机) + Ubuntu 12.04
1 安装增强功能包1.1 运行Ubuntu并登陆,菜单“设备”->“安装增强功能包(Install Guest Additions)”ubun1.2 桌面上会多出一个光盘图标,光盘默认自动加载到 ...
- xml配置文件特殊符号的处理方法
2017.7.19遇到问题:偶然出现“认证失败,请重新登录”的现象 在xml中英文问号“?”是可以被正常解析的,但是以下这几种符号是不能正常解析的:分别是“&”.“<”.“>” ...
- js备忘录2
JavaScript 的类型分为两类,分别是原始类型和对象类型 其中原始类型中只有数字.字符串和布尔型,和java中的有些不一样 null和undefined不是基本数据类型中的某一种 对象是prop ...
- Arithmatic项目修改总结
Arithmatic项目修改总结 github仓库 arithmatic3.0 一. 修改介绍 修改后类图: 1.关于类的合并 ==可以发现相比右边(旧)的类,左边(新)的类少了很多,这是我这次大改的 ...