• [BZOJ1026][SCOI2009]windy数


    [BZOJ1026][SCOI2009]windy数

    试题描述

    windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
    在A和B之间,包括A和B,总共有多少个windy数?

    输入

    包含两个整数,A B。

    输出

    一个整数

    输入示例

    25 50

    输出示例

    20

    数据规模及约定

    100%的数据,满足 1 <= A <= B <= 2000000000 。

    题解

    数位 dp,设 f(i, j) 表示一个 i 位的数字的最高位(即第 i 位)是 j 的数字有多少个,转移就很简单了。

    对于区间 [a, b] 的答案,我们可以求出 sum(a) 和 sum(b+1) 的值(为什么是 b+1,请往下看),相减就好了。

    至于求 sum(x),设 x 有 t 为,我们先找到所有 t-1 位的 windy 数,然后从高向底一位一位地确定为原数字 x 上相应位上的数字,在此基础上累计方案数,这样我们就可以求出 [0, x) 的 windy 数的个数了。(因为我是确定到最低位就退出了,所以取不到 x,再不明白就请琢磨一下代码吧)注意需要判断 x 本身那几位是不是符合 windy 数的条件。

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    int read() {
    	int x = 0, f = 1; char c = getchar();
    	while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
    	while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
    	return x * f;
    }
    
    #define maxn 15
    int f[maxn][maxn];
    
    int calc(int x) {
    	int num[maxn], cnt = 0;
    	while(x) num[++cnt] = x % 10, x /= 10;
    	int ans = 0;
    	for(int i = 1; i < cnt; i++)
    		for(int j = 1; j <= 9; j++) ans += f[i][j];
    	for(int i = cnt; i; i--) {
    		for(int j = (i == cnt ? 1 : 0); j < num[i]; j++) if(i == cnt || abs(j - num[i+1]) >= 2) ans += f[i][j];
    		if(i < cnt && abs(num[i+1] - num[i]) < 2) break;
    	}
    	return ans;
    }
    
    int main() {
    	for(int i = 0; i <= 9; i++) f[1][i] = 1;
    	for(int i = 1; i <= 10; i++)
    		for(int j = 0; j <= 9; j++) {
    			for(int k = 0; k <= j - 2; k++) f[i+1][k] += f[i][j];
    			for(int k = j + 2; k <= 9; k++) f[i+1][k] += f[i][j];
    //			printf("%d %d: %d
    ", i, j, f[i][j]);
    		}
    	
    	int a = read(), b = read();
    	printf("%d
    ", calc(b + 1) - calc(a));
    	
    	return 0;
    }
    /*
    1 2000000000
    123456 928374445
    */
    
  • 相关阅读:
    yum上包找不到时,用rpmsearch
    多语言国家与缩写映射表
    M_LROOT,LD_LIBRARY_PATH, “Not all extension Dlls were loaded”问题原因及解决方法(持续更新)
    android 手机信息获取
    32位和64位adb下载及安装
    basename usage in linux
    单台centos7.3 虚拟机实现主从复制和哨兵集群
    XXL-JOB分布式任务调度平台安装与部署
    MySQL5.7压缩包安装图文教程
    基于Consul+Upsync+Nginx实现动态负载均衡
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6055686.html
Copyright © 2020-2023  润新知