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

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

题目描述就是对于一个十进制数数位上的每一位当做一个二进制位来求出这个数,这个定义为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. TCP/IP 协议簇 端口 三次握手 四次挥手 11种状态集

    第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成 ...

  2. 41F继电器座的解剖与妙用

    摘要:如果继电器不是焊在电路板上使用,就需要有个插座,这样方便接线,否则继电器的管脚是没法固定导线的.实际项目中使用了HF41F的继电器(宏发),在选择继电器座的时候,有一点感想,分享给大家.继电器是 ...

  3. 简单字典实现(KV问题)

    搜索二叉树基本概念请看上篇博客 这两个问题都是典型的K(key)V(value)问题,我们用KV算法解决. 判断一个单词是否拼写正确:假设把所有单词都按照搜索树的性质插入到搜索二叉树中,我们判断一个单 ...

  4. git pull fatal: refusing to merge unrelated histories

    1.首先我github有个远程仓库,然后我本地有个仓库 本地仓库我新添加了一个文件,然后我去关联(git remote add origin git@github.com:qshilary/gitte ...

  5. ETCD分布式存储部署

    一.ETCD 概述 ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置.具有一下优点: 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致 ...

  6. 学习python最难的就是入门,而这文章刚好适合初学者!

    Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.Dropbox.BT ...

  7. 微信小程序自定义 tabbar

    一定的需求情况下,无法使用小程序原生的 tabbar 的时候,需要自行实现一个和 tabbar 功能一模一样的自制组件. 查阅了海量的博客和文档之后,亲自踩坑.总结了三种在不使用微信小程序原生 tab ...

  8. 亚马逊如何变成 SOA(面向服务的架构)

    . 亚马逊公司不仅是世界最大的网络书店,还是世界最大的云服务商.它是怎么实现从电商到云商的转变呢? 一切都是CEO杰夫·贝索斯促成的,他对市场有着超乎常人的理解和预见. 2. 2000年前后,贝索斯有 ...

  9. jaxb教程(忘记了过来看看)

    链接 原文链接

  10. map的运用

    一.map是一种关联容器,支持高效的查找和访问 map中的元素是一些关键字-值(key-value)对: 关键字起索引作用: 值表示与索引相关联的数据. 关联容器中元素是根据关键字存储的,故其不支持位 ...