给一个数A (十进制表示形式为AnAn-1An-2 ... A2A1,定义函数 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,给一个B,求B以内的i,满足F(i)<=F(A)

Sample Input

3
0 100
1 10
5 100
 
Sample Output
Case #1: 1
Case #2: 2
Case #3: 13
 
一开始状态s设置的是前面位数的和,但是这样每次dp对应的值都不同,需要重新清空,浪费了很多时间,于是重新设置s为小于s的数目,这样dp就不用每次重新计算,而达到记忆化搜索的效果,虽然仅仅改了几行代码,但速度快了很多,状态的设置要考虑好

TLE代码

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a,b;
int fa; //fa的值
int dp[][],digit[];
int cal(int n)
{
int len=,sum=;
while(n)
{
sum=sum+(n%)*(<<(len-));
len++;
n/=;
}
return sum;
}
int dfs(int p,int s,bool e) { //位数,前面计算的和,任意填
if(s>fa) return ;
if (p==-) return s<=fa;
if (!e &&dp[p][s]!=-) return dp[p][s];
int res = ;
int u = e?digit[p]:;
for (int d=;d<=u;++d)
{
int ns=s+d*(<<p);
res+=dfs(p-,ns,e&&d==u);
}
return e?res:dp[p][s]=res;
}
int solve(int n)
{
int len=;
while(n)
{
digit[len++]=n%;
n/=;
}
return dfs(len-,,);
}
int main()
{
int t;
//freopen("1.in","r",stdin);
scanf("%d",&t);
for(int i=;i<=t;i++)
{
memset(dp,-,sizeof(dp));
scanf("%d%d",&a,&b);
fa=cal(a);
//printf("%d %d\n",a,fa);
printf("Case #%d: %d\n",i,solve(b));
}
return ;
}

AC代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a,b;
int fa; //fa的值
int dp[][],digit[];
int cal(int n)
{
int len=,sum=;
while(n)
{
sum=sum+(n%)*(<<(len-));
len++;
n/=;
}
return sum;
}
int dfs(int p,int s,bool e) { //位数,小于s的数量,任意填
if (p==-) return s>=;
if(s<) return ;
if (!e &&dp[p][s]!=-) return dp[p][s];
int res = ;
int u = e?digit[p]:;
for (int d=;d<=u;++d)
{
int ns=s-d*(<<p);
res+=dfs(p-,ns,e&&d==u);
}
return e?res:dp[p][s]=res;
}
int solve(int n)
{
int len=;
while(n)
{
digit[len++]=n%;
n/=;
}
return dfs(len-,fa,);
}
int main()
{
int t;
//freopen("1.in","r",stdin);
scanf("%d",&t);
memset(dp,-,sizeof(dp));
for(int i=;i<=t;i++)
{
scanf("%d%d",&a,&b);
fa=cal(a);
//printf("%d %d\n",a,fa);
printf("Case #%d: %d\n",i,solve(b));
}
return ;
}

最新文章

  1. Java排序算法——拓扑排序
  2. ruby 查询mysql方法
  3. 基于Flot可放缩的折线图
  4. HttpClient I/O exception (java.net.SocketException) caught when processing request: Connect
  5. linux取某个字段排重
  6. WP开发笔记——控件倾斜效果
  7. 使用putty登陆cygwin出现server unexpectedly ...error.解决方案
  8. setlocal enabledelayedexpansion
  9. 阿赫亚web安全JSON
  10. 玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析
  11. springboot接口访问权限AOP实现
  12. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
  13. leetcode 翻转二叉树
  14. Python Matplot中文显示完美解决方案
  15. DevExpress ASP.NET Core Controls v18.2新功能详解
  16. MD5 算法
  17. (maven项目)使用java -jar命令遇到的小问题|xx.jar中没有主清单或Error:Invalid or corrupt jarfile xx.jar
  18. mysql中floor函数的作用是什么?
  19. 【mybatis】认识selectKey
  20. kotlin Hello World 以及关键字

热门文章

  1. Linux Vsftpd 连接超时解决方法
  2. 常见的SQL语句
  3. Silverlight 中datagrid控件-- 通过设置数据虚拟化加速显示
  4. Majority Number I &amp; || &amp;&amp; |||
  5. Django用户管理及认证
  6. C++构造函数初始化顺序
  7. c++ 文件utf-8格式
  8. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)
  9. Python:IDLE清屏
  10. Quartz结合SPRING多任务定时调用