• bzoj-1026 windy数


    题意:

    定义一种windy数。这个数在十进制下相邻两个数字之差至少为2的正整数;

    求区间[A,B]的这样的数的个数;

    n<=10^9;


    题解:

    数位乱搞。

    首先求区间[A。B]等价于求[1,A-1]和[1,B]的答案。

    直接DP肯定不行,所以考虑一位一位来;

    定义f[i][j]为首位为j的i位的windy数有几个;

    sum[i]为不含前导零的i位的windy数有几个。

    那么对于一个数来说,比它位数小的肯定能够加进去;

    然后从首位開始枚举,能够将比当前位小,且与上一位相邻数字差大于等于2的f[i][j]增加;

    可是假设有某位和上一位差小于2。那就能够break出循环,由于后面已经不会有满足条件的windy数了。

    这样求出的实际上是那个数-1的前缀和,那么我们将B+1之后两个相减就能够得到答案了;

    时间复杂度O(10^3);

    结果预处理f数组的时间似乎最长(笑)。

    考场AC略丑勿怪;


    代码:


    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int f[20][20],sum[20];
    int st[20],top;
    int main()
    {
    	int n,m,i,j,k;
    	int A,B,l,r;
    	scanf("%d%d",&A,&B);
    	for(i=0;i<10;i++)	f[1][i]=1;
    	for(i=2;i<=10;i++)
    	{
    		for(j=0;j<10;j++)
    		{
    			for(k=0;k<10;k++)
    			{
    				if(abs(j-k)<2)	continue;
    				f[i][j]+=f[i-1][k];
    			}
    		}
    	}
    	for(i=1;i<=10;i++)
    	{
    		for(j=1;j<=10;j++)
    			sum[i]=sum[i]+f[i][j];
    	}	
    	i=1,l=0,top=0;
    	while(A)
    	{
    		k=A%10;
    		l+=sum[i-1];
    		st[++top]=k;
    		i++;
    		A/=10;
    	}
    	for(i=1;i<st[top];i++)
    		l+=f[top][i];
    	for(i=top-1;i>0;i--)
    	{
    		for(j=0;j<st[i];j++)
    		{
    			if(abs(j-st[i+1])<2)	continue;
    			l+=f[i][j];
    		}
    		if(abs(st[i]-st[i+1])<2)
    			break;
    	}
    	B++;
    	i=1,r=0,top=0;
    	while(B)
    	{
    		k=B%10;
    		r+=sum[i-1];
    		st[++top]=k;
    		i++;
    		B/=10;
    	}
    	for(i=1;i<st[top];i++)
    		r+=f[top][i];
    	for(i=top-1;i>0;i--)
    	{
    		for(j=0;j<st[i];j++)
    		{
    			if(abs(j-st[i+1])<2)	continue;
    			r+=f[i][j];
    		}
    		if(abs(st[i]-st[i+1])<2)
    			break;
    	}
    	printf("%d",r-l);
    	return 0;
    }
    



  • 相关阅读:
    刷题-力扣-剑指 Offer 22. 链表中倒数第k个节点
    刷题-力扣-617. 合并二叉树
    刷题-力扣-1109. 航班预订统计
    刷题-力扣-606. 根据二叉树创建字符串
    刷题-力扣-563. 二叉树的坡度
    扛把子组20191017-8 alpha week 2/2 Scrum立会报告+燃尽图 07
    20191017-7 alpha week 2/2 Scrum立会报告+燃尽图 06
    20191017-6alpha week 2/2 Scrum立会报告+燃尽图 05
    扛把子组20191017-5 alpha week 2/2 Scrum立会报告+燃尽图 04
    记第一次 团建
  • 原文地址:https://www.cnblogs.com/llguanli/p/7131556.html
Copyright © 2020-2023  润新知