XDOJ1185 - 钟爱的数字

来源:互联网 发布:预算编制软件 编辑:程序博客网 时间:2024/06/09 16:41
Description

   LL最喜欢的数字是2 3 8,现在他想知道,从a到b中间,有多少个数字只包含2,3,8

 



Input
 有多组输入数据,第一行为一个数字case,代表有多少组输入数据 (case<=20)
 以下case行每行包含两个正整数a,b代表如题意所述的区间 (1<=a<=b<=10^8)
Output
 一共case行,每行一个整数对应该组区间内包含多少个期望的数字
Sample Input
2
2 3
2 11
Sample Output
2
3
解题思路:
由于数字只能由2、3、8组成,所以可以找出小于10^8的所有的合格要求的数,可以用BFS或DFS找到符合要求的数,并把它们存储起来。保证从小到大的顺序,然后找到大于等于a的第一个数所有索引,再找到大于b的第一个数所在的索引,最后求得这两个索引的差,即为结果。
#include<iostream>#include<vector>#include<deque>#include<algorithm>using namespace std;const int D = 8;vector<int> number;deque<int> Q;void init(){    Q.push_back(2);    Q.push_back(3);    Q.push_back(8);}void BFS(){    int depth = 0;    int n = 0;    int m = 3;    int fact = 10;    while(!Q.empty())    {        int t = Q.front();        Q.pop_front();        ++n;        if(n%m==0)        {            ++depth;            m = 3*m;            n = 0;            if(depth==D)            {                number.push_back(t);                break;            }        }        number.push_back(t);        Q.push_back(2+fact*t);        Q.push_back(3+fact*t);        Q.push_back(8+fact*t);    }}int main(){    int caseN;    cin>>caseN;    init();    BFS();    for(int m=0;m<caseN;++m)    {        int a,b;        cin>>a>>b;        vector<int>::iterator itera = find_if(number.begin(),number.end(),bind2nd(greater_equal<int>(),a));        vector<int>::iterator iterb = find_if(number.begin(),number.end(),bind2nd(greater<int>(),b));        cout<<iterb-itera<<endl;    }    return 0;}


0 0