题意:

给你一个n位的数x(A(n)A(n-1)...A(1)),那么F(x)=A(n)*2^(n-1)+A(n-1)*2^(n-2)......+A(1)*2^(0)

题目输入A、B

你需要找出来在[0,B]这个范围内有多少个数的F(x)大于F(A)

题解:

这个就是卡memset函数的,而且要注意dp方程的选定

注释+正确代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<iostream>
5 using namespace std;
6 const int maxn=15;
7 typedef long long ll;
8 ll v[maxn],dp[maxn][200005],standard;
9 ll dfs(ll pos,ll sum,bool limit)
10 {
11 if(sum<0)
12 return 0;
13 if(pos==-1)
14 {
15 return 1;
16 }
17 if(!limit && dp[pos][sum]!=-1) return dp[pos][sum];
18 ll up=limit?v[pos]:9;
19 ll tmp=0;
20 for(ll i=0; i<=up; ++i)
21 {
22 tmp+=dfs(pos-1,sum-i*(1<<pos),limit && i==v[pos]);
23 }
24 if(!limit) dp[pos][sum]=tmp;
25 return tmp;
26 }
27 ll solve(ll ans)
28 {
29 ll pos=0;
30 while(ans)
31 {
32 v[pos]=ans%10;
33 pos++;
34 ans/=10;
35 }
36 return dfs(pos-1,standard,true);
37 }
38 int main()
39 {
40 ll ans;
41 ll t,n,p=0;
42 scanf("%I64d",&t);
43 memset(dp,-1,sizeof(dp));
44 //这个题目就是为了卡这个memset,如果memset写在里面就会t
45 //这就限制了你的dp方程只能是
46 //dp[x][y]表示:在第x位,距离限制(就是题目上的F(A))还剩余y个大小
47 while(t--)
48 {
49
50 scanf("%I64d%I64d",&standard,&n);
51 ans=0;
52 ll i=1;
53 while(standard)
54 {
55 ans=ans+(standard%10)*i;
56 i*=2;
57 standard/=10;
58 }
59 standard=ans;
60 //printf("%d\n",ans);
61 printf("Case #%I64d: %I64d\n",++p,solve(n));
62 }
63 return 0;
64 }

错误代码+注释:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<iostream>
5 using namespace std;
6 const int maxn=15;
7 typedef long long ll;
8 ll v[maxn],dp[maxn][200005],w[maxn],standard;
9 ll dfs(ll pos,ll sum,bool limit)
10 {
11 if(sum>standard)
12 return 0;
13 if(pos==-1)
14 {
15 return 1;
16 }
17 if(!limit && dp[pos][sum]!=-1) return dp[pos][sum];
18 ll up=limit?v[pos]:9;
19 ll tmp=0;
20 for(ll i=0;i<=up;++i)
21 {
22 tmp+=dfs(pos-1,sum+i*w[pos],limit && i==v[pos]);
23 }
24 if(!limit) dp[pos][sum]=tmp;
25 return tmp;
26 }
27 ll solve(ll ans)
28 {
29 ll pos=0;
30 while(ans)
31 {
32 v[pos]=ans%10;
33 pos++;
34 ans/=10;
35 }
36 return dfs(pos-1,0,true);
37 }
38 int main()
39 {
40 ll ans=1;
41 ll t,n,p=0;
42 w[0]=1;
43 for(ll i=1;i<=15;++i)
44 {
45 ans*=2;
46 w[i]=ans;
47 }
48 scanf("%I64d",&t);memset(dp,-1,sizeof(dp));
49 while(t--)
50 {
51
52 //memset拿进来结果对但是超时,拿出去结果错
53 // 原因就是我得dp方程没有写好,
54 // 我的dp[x][y]表示:枚举到第x位,现在的大小是多少
55 // 这个样子的话你第一次随便跑一个值比如1
56 // 因为你是要和F(A)作比较才可以,你光知道这个值多大是不能用于下一组数据记忆化搜索的
57
58 scanf("%I64d%I64d",&standard,&n);
59 ans=0;
60 ll i=1;
61 while(standard)
62 {
63 ans=ans+(standard%10)*i;
64 i*=2;
65 standard/=10;
66 }
67 standard=ans;
68 //printf("%d\n",ans);
69 printf("Case #%I64d: %I64d\n",++p,solve(n));
70 }
71 return 0;
72 }

F(x) HDU - 4734的更多相关文章

  1. 数位dp H - F(x) HDU - 4734

    http://acm.hdu.edu.cn/showproblem.php?pid=4734 一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数, ...

  2. 【数位DP】 HDU 4734 F(x)

    原题直通车:HDU 4734 F(x) 题意:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1, 求0.....B中F[x]<=F[A ...

  3. HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4734 数位DP. 用dp[i][j][k] 表示第i位用j时f(x)=k的时候的个数,然后需要预处理下小 ...

  4. HDU 4734 - F(x) - [数位DP][memset优化]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 Time Limit: 1000/500 MS (Java/Others) Memory Lim ...

  5. hdu 4734 F(x)(数位dp+优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题意:我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2 ...

  6. HDU 4734 F(x)

    这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  7. HDU - 4734 F(x) (数位dp)

    For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n  ...

  8. 题解——HDU 4734 F(x) (数位DP)

    这道题还是关于数位DP的板子题 数位DP有一个显著的特征,就是求的东西大概率与输入关系不大,理论上一般都是数的构成规律 然后这题就是算一个\( F(A) \)的公式值,然后求\( \left [ 0 ...

  9. HDU 4734 F(x) (2013成都网络赛,数位DP)

    F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. 【Python】部署上手App后端服务器 - Linux环境搭建安装Python、Tornado、SQLAlchemy

    基于阿里云服务器端环境搭建 文章目录 基于阿里云服务器端环境搭建 配置开发环境 安装 Python 3.8.2 安装 Tornado 安装 MySQL 安装 mysqlclient 安装 SQLAlc ...

  2. Netty学习:伪共享

    目录 Netty中的伪共享 伪共享的原理以及介绍 Netty中的伪共享 先说为什么知道这个概念吧,期初看Netty源码的时候,看到了NioEventLoop的构建,其中有这么一句代码: private ...

  3. 通过LOGMNR查找程式带入的实际值

    生产库中出现了大量的锁表,需要得到当时程式执行的SQL以及其带入的值 1.查看SQL SELECT SQL_ID FROM V$SESSION WHERE SID=(SELECT FINAL_BLOC ...

  4. library cache pin解决方法

    library cache pin大部分都是因为编译存储过程造成的 查找造成问题的数据库对象(一般为存储过程) SELECT * FROM v$session_wait WHERE event = ' ...

  5. 入门OJ:photo

    题目描述 有N个人,来自K个家族.他们排成一行准备照相,但是由于天生的排外性,每个人都希望和本家族的人站在一起,中间不要加入别的家族的人.问最少从队列中去掉多少个就可以达到这个目的. 输入格式 第一行 ...

  6. 如何在K8s,Docker-Compose注入镜像Tag

    最近在做基于容器的CI/CD, 一个朴素的自动部署的思路是: 从Git Repo打出git tag,作为镜像Tag ssh远程登录到部署机器 向部署环境注入镜像Tag,拉取镜像,重新部署 下面分享我是 ...

  7. MYSQL面试题-索引

    MYSQL面试题-索引 引自B站up编程不良人:https://www.bilibili.com/video/BV19y4y127h4 一.什么是索引? 官方定义:索引是一种帮助mysql提高查询效率 ...

  8. 【AtCoder Beginner Contest 181】A~F题解

    越学越菜系列 于2020.11.2,我绿了(错乱) A - Heavy Rotation 签到题,奇数Black,偶数White. code: #include<bits/stdc++.h> ...

  9. NFS存储迁移至GlusterFS

    NFS存储迁移至GlusterFS 前提条件 为防止脑裂,建议使用最低3台节点制作3复制集的存储卷: 在进行存储迁移前,GluseterFS存储节点需先成为k8s集群中的node节点: 存储切换时请勿 ...

  10. 面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场

    摘要:Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力:(2)区间查询很低效.如何对这两个限制进行优化呢?这就轮到本文介绍的主角,LSM树,出场了. 我 ...