【2019.10.25 OI-Killer的模拟赛】3.鸡数

题目链接

题意:

  定义“鸡数”指从高位到低位单调不减的数。求$[a,b]$之间有多少个“鸡数”。$t$组询问。

  $1\le t\le 10^5,\; 1\le a\le b\le 2^{31}-1$

分析:

  数位DP。设$f[i][j]$表示长度为$i$,最高位是$j$的“鸡数”个数,那么$$f[i][j]=\sum\limits^9_{k=j}f[i-1][k]$$

  且$$f[1][i]=1\;(1\le i\le 9)$$

  那么对于一个长度为$l$的$n$且由低到高位写成$s_{1\dots l}$,$[1,n)$的答案可以分成这么几个部分:

  1.长度小于$l$的所有$f$

  2.长度为$i\in [1,l)$中,最高位是$x\in [s_{i+1},s_i)$的$f$

实现(100分):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define IL inline
#define UI unsigned int
#define RI register int
#define _1 first
#define _2 second
using namespace std;
const int N=10;
const int M=9;

    int f[N+3][M+3];
    int g[N+3],h[N+3];

    int k,s[N+3];
IL int calc(int x){
    k=0;
    while(x>0){
        s[++k]=x%10;    x/=10;
    }

    int ret=h[k-1];
    s[k+1]=0;
    for(int i=k;i>0&&s[i]>=s[i+1];i--)
        for(int j=s[i+1];j<s[i];j++)
            ret+=f[i][j];
    return ret;

}

    int T,a,b;

int main(){
    memset(f,0,sizeof f);
    memset(g,0,sizeof g);
    memset(h,0,sizeof h);
    for(int i=1;i<=M;i++)
        f[1][i]=1;
    g[1]=h[1]=M;
    for(int i=2;i<=N;i++){
        for(int j=1;j<=M;j++){
            for(int k=j;k<=M;k++)
                f[i][j]+=f[i-1][k];
            g[i]+=f[i][j];
        }
        h[i]=h[i-1]+g[i];
    }

    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&a,&b);
        printf("%d\n",calc(b+1)-calc(a));

    }

    return 0;

}

小结:

  数位DP大同小异,推出通式,分割每位的答案再加起来。

原文地址:https://www.cnblogs.com/Hansue/p/11740315.html

时间: 2024-08-30 10:27:59

【2019.10.25 OI-Killer的模拟赛】3.鸡数的相关文章

2019浙大计算机考研机试模拟赛(2)——概念专题

题目链接   引用自晴神OJ A - 边覆盖 B - 极大独立集 C - 稳定婚姻问题 D - 笛卡尔树 没赶得上全程的比赛,就做了两道,后面两道以后有时间再补.两道都是概念题,比较基础~ 以下是题解 A - 边覆盖 Case Time Limit: 200 MS (Others) / 400 MS (Java)       Case Memory Limit: 256 MB (Others) / 512 MB (Java) Accepted: 199      Total Submission

2014.10.31我出的模拟赛【天神下凡】

天神下凡(god.*) 背景 Czy找到宝藏获得屠龙宝刀和神秘秘籍!现在他要去找经常ntr他的Jmars报仇…… 题目描述 Czy学会了一招“堕天一击”,他对一个地点发动堕天一击,地面上就会留下一个很大的圆坑.圆坑的周围一圈能量太过庞大,因此无法通过.所以每次czy发动技能都会把地面分割.Jmars拥有好大好大的土地,几十眼都望不到头,所以可以假设土地的大小是无限大.现在czy对他发动了猛烈的攻击,他想知道在泽宇攻击之后他的土地被切成几份了? Czy毕竟很虚,因此圆心都在x坐标轴上.另外,保证所

10.06 国庆节第九场模拟赛

密钥(key) Description 在这个问题中,一个密钥是指一个长度为\(3n\)的二进制序列,其中\(n\)是正整数. 序列的每一位从左往右依次被编号为\(1\)到\(3n\) ,一个密钥的权值是指数字不同的相邻位的个数再加上\(1\) .比如: \(000\) 的权值是 \(1\), \(011010100\) 的权值是 \(7\). 密钥可以被修改.确切地说,你可以不断地进行下面的操作:任选两个相邻的位,然后同时将它们取反.例如,可以通过一次操作把 \(000\) 修改为 110 .

2014.10.31我出的模拟赛【藏宝图】

藏宝图(treas.*) 背景 Czy爬上黑红树,到达了一个奇怪的地方…… 题目描述 Czy发现了一张奇怪的藏宝图.图上有n个点,m条无向边.已经标出了图中两两之间距离dist.但是czy知道,只有当图刚好又是一颗树的时候,这张藏宝图才是真的.如果藏宝图是真的,那么经过点x的边的边权平均数最大的那个x是藏着宝物的地方.请计算这是不是真的藏宝图,如果是真的藏宝之处在哪里. 格式 输入数据第一行一个数T,表示T组数据. 对于每组数据,第一行一个n,表示藏宝图上的点的个数. 接下来n行,每行n个数,表

2014.10.31我出的模拟赛【挖掘机】

挖掘机(dig.*) 背景 附中机房谁最虚?高二一班***!感觉很顺,是吧? 题目描述 今天,丧尸czy开着挖掘机去上学(……).但是他发现他的mz满天下,所以一路上他碰到了好多他的mz.一开始他以1km/min的速度(=60km/h……)开着挖掘机前进.他发现他只会在恰好到达某一时刻或者到达某个距离遇到mz.每次遇到mz,czy都会毫不犹豫的把她们顺路捎走(^_^).但是他实在是太虚了,以至于当有i个mz时他的速度下降到1/(i+1).具体说,一开始czy以1km/min速度前进,有1个mz的

2014.10.31我出的模拟赛【黑红树】

黑红树(brtree.*) 背景 Mz们在czy的生日送他一个黑红树种子……czy种下种子,结果种子很快就长得飞快,它的枝干伸入空中看不见了…… 题目描述 Czy发现黑红树具有一些独特的性质. 1. 这是二叉树,除根节点外每个节点都有红与黑之间的一种颜色. 2. 每个节点的两个儿子节点都被染成恰好一个红色一个黑色. 3. 这棵树你是望不到头的(树的深度可以到无限大) 4. 黑红树上的高度这样定义:h(根节点)=0,h[son]=h[father]+1. Czy想从树根顺着树往上爬.他有p/q的概

【2019.10.25】

summary 分情况拿分保底真的很好用 像我这种辣鸡应该注意保底 打题不要慌 有条理 不要东一条西一条 小奇采药 对于 30% 的数据,O(2n ) 枚举取 or 不取 对于 60% 的数据,O(nm) 做 01 背包,即 f(i, j) 表示前 i 株 草药,耗费 j 的时间能达到的最?代价. 对于 100% 的数据,注意到 m,t,v 纯随机 那么不会选太多的草药,?耗时较少的草药有很?概率存在 于最优解中 针对这些性质优化搜索 当然也可以合理使用随机化和卡时,复杂度 O(?学) 最基础6

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],