递增数 1002

来源:互联网 发布:二维矩阵 编辑:程序博客网 时间:2024/06/14 01:07
Problem Description
若一个正整数A,相邻位总是满足低位大于等于高位,则称之为递增数。
例如:1223,667 等都是递增数。

现在有个正整数X,请问有多少个正整数A满足1<=A<=X,且A为递增数。
 

Input
输入数据第一行是一个正整数T(1<=T<=20),表示测试数据的组数。
接下来T行,每行一个正整数X(1<=X<=100000000)。
 

Output
对于每组数据,输出一行答案,参见输出样例。
 

Sample Input
3520100
 

Sample Output
51854
 

//递增数 1002//Problem Description//若一个正整数A,相邻位总是满足低位大于等于高位,则称之为递增数。//例如:1223,667 等都是递增数。////现在有个正整数X,请问有多少个正整数A满足1<=A<=X,且A为递增数。// ////Input//输入数据第一行是一个正整数T(1<=T<=20),表示测试数据的组数。//接下来T行,每行一个正整数X(1<=X<=100000000)。// ////Output//对于每组数据,输出一行答案,参见输出样例。// ////Sample Input//3//5//20//100// ////Sample Output//5//18//54 //这题如果纯暴力肯定会超时,所以要用其他方式处理一下,网上说的贪心也挺好当时也想过,最早想到的是全排+回溯//这是我最早ac的题,因为1001跳了就看了1002 //大一不懂此算法的可以看我的注释,还不懂可以问我//我们还是边看边讲吧#include<cstdio>#include<string>#include<iostream>#include<cstring>using namespace std;int s;//s用来记录满足的数量 void di(int x,int cur,int mmax ,int v,int n)//这是一个递归函数,mmax用来记录这个数每一位数中最大值(比如35817,mmax=8) {//cur代表数现在的位数,v代表这个数的值,n是题目所给的     if(cur==x)//如果位数一样,则比较大小是否满足     {        if(v<=n)        s++;//满足数量+1         return ;//否则返回上个函数     }    else    {        for(int i=0;i<=9;i++)//每个位上出现可能0-9         {            int t=mmax;//             if(i>=mmax)//如果要填的数大于mmax,满足条件,继续执行             {                mmax=i;//最大值更新                 cur++;//位数+1                 v=v*10+i;//值变化                 di(x,cur,mmax,v,n);//递归考虑下一位数                 mmax=t;//这里是回溯的方法,差不多就是还原                 cur--;                v=v/10;            }            else ;        }    }}int main(){    int t,n;    cin>>t;    while(t--)    {        s=0;//初始化一定要注意         cin>>n;        int x=0,y=n;        while(y)//统计n的位数         {            y=y/10;            x++;        }         di(x,0,0,0,n);//进行全排         cout<<s-1<<endl;//s-1的原因是因为0也统计在内了     }    return 0;} 

0 0
原创粉丝点击