博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1026: [SCOI2009]windy数
阅读量:5241 次
发布时间:2019-06-14

本文共 1194 字,大约阅读时间需要 3 分钟。

1026: [SCOI2009]windy数

Time Limit: 1 Sec  Memory Limit: 162 MB

Submit: 8511  Solved: 3838

[][][]

Description

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

Input

  包含两个整数,A B。

Output

  一个整数

Sample Input

【输入样例一】

1 10
【输入样例二】
25 50

Sample Output

【输出样例一】

9
【输出样例二】
20

HINT

【数据规模和约定】

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

题解

f[i][j]表示i位数,最高位为j时的满足条件的数的个数。

先预处理出f数组。

对于一个数x,先算位数比它小的数的个数和,再算位数相等,最高位小于它的数的个数和。

最后算前i位相同的数的个数和。

代码

#include
#include
#include
#include
#include
const int N=15;int a,b;int f[N][N],num[N];using namespace std;void get_f(){ for(int i=0;i<=9;i++){ f[1][i]=1; } for(int i=2;i<=10;i++){ for(int j=0;j<=9;j++){ for(int k=0;k<=9;k++){ if(abs(j-k)>=2)f[i][j]+=f[i-1][k]; } } }}int solve(int n){ int len=0,ans=0; while(n){ num[++len]=n%10; n/=10; } num[len+1]=0; for(int i=1;i
=0;i--){ if(i==0)ans++; for(int j=0;j
=2)ans+=f[i][j]; } if(abs(num[i]-num[i+1])<2)break; } return ans;}int main(){ get_f(); scanf("%d%d",&a,&b); printf("%d\n",solve(b)-solve(a-1)); return 0;}

转载于:https://www.cnblogs.com/chezhongyang/p/7690583.html

你可能感兴趣的文章
hihoCoder 1233 : Boxes(盒子)
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>
Vue
查看>>
python-三级菜单和购物车程序
查看>>
条件断点 符号断点
查看>>
VMware12 + Ubuntu16.04 虚拟磁盘扩容
查看>>
水平垂直居中
查看>>
MySQL简介
查看>>
设计模式之桥接模式(Bridge)
查看>>
jquery的$(document).ready()和onload的加载顺序
查看>>
Python Web框架Django (五)
查看>>