今天做的比赛,和队友都有轻微被虐的赶脚。

诶,我做的题就是这个题目了。

题目描述就是对于一个十进制数数位上的每一位当做一个二进制位来求出这个数,这个定义为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的更多相关文章

  1. 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 ...

  2. 2013 ACM/ICPC Asia Regional Chengdu Online---1003

    哈哈哈 #include <iostream> #include <cstring> #include <string> #include <cstdio&g ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. vue复习(一)

    一.认识Vue 定义:一个构建数据驱动的Web界面的渐进式框架 优点: 1.可以完全通过客户端浏览器渲染页面,服务器端只提供数据 2.方面构建单页面应用程序(SPA) 二.引入Vue <!DOC ...

  2. SSIS 容器

    容器(Container)是控制流的特殊的任务(Task),它为一个或多个Task提供逻辑组合,可以实现工作流的重复执行和顺序执行,还可以把变量和事件处理程序的作用域缩小到容器中.不能在容器内的Tas ...

  3. Python学习过程笔记整理(三)

    函数 -函数使用 -函数需要先定义,定义不会执行函数 -使用函数,俗称调用 -定义函数 -格式:def 函数名称(参数=默认值):,函数名称不能用大驼峰,参数可以没有 -调用函数 -格式:函数名(参数 ...

  4. Unity_屏幕/Viewport/世界坐标的转换

    Unity_屏幕/Viewport/世界/UI坐标的转换 参考: https://www.jianshu.com/p/b5b6ac9ab145 -- 世界.视口.屏幕坐标转换 https://docs ...

  5. 正则表达式的捕获组(Java)

    捕获组分类 普通捕获组(Expression) 命名捕获组(?<name>Expression) 普通捕获组 从正则表达式左侧开始,每出现一个左括号“(”记做一个分组,分组编号从1开始.0 ...

  6. Workbook对象的方法总结(二)

    (1).Worksheet 对象有 row_dimensions 和 column_dimensions 属性,控制行高和列宽. 例如: >>> sheet.row_dimensio ...

  7. nodejs 搭建自己的简易缓存cache管理模块

    http://www.infoq.com/cn/articles/built-cache-management-module-in-nodejs/ 为什么要搭建自己的缓存管理模块? 这个问题其实也是在 ...

  8. R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲

    这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...

  9. Python序列之元组 (tuple)

    作者博文地址:http://www.cnblogs.com/spiritman/ Python的元组与列表类似,同样可通过索引访问,支持异构,任意嵌套.不同之处在于元组的元素不能修改.元组使用小括号, ...

  10. (第十周)Beta-2阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...