hdu4151(二分)

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4151

 

题意:找出比n小的没有重复数字的总个数,例如12以内11不符合,1~10都符合。

 

分析:直接利用lower_bound函数找出比n刚好大的位置再减一就是答案。这里a数组从0开始,所以不用减一。

 

#include <cstdio>

#include <cstring>

#include <cmath>

#include <iostream>

#include <algorithm>

#include <queue>

#include <cstdlib>

#include <vector>

#include <set>

#include <map>

#define LL long long

#define mod 1000000007

#define inf 1<<30

#define N 10000000

using namespace std;

int a[1000000],tot;

int vis[10];

void init()

{

    tot=0;

    for(int i=1;i<=N;i++)

    {

        int temp=i;

        memset(vis,0,sizeof(vis));

        while(temp)

        {

            int t=temp%10;

            if(!vis[t])vis[t]=1;

            else break;

            temp/=10;

        }

        if(!temp)a[tot++]=i;

    }

}

int main()

{

   int n;

   init();

   while(scanf("%d",&n)>0)

   {

      // printf("%d\n",lower_bound(a,a+tot,n)-a);

       int left=0,right=tot,ans=0;

       while(left<right)

       {

          int mid=left+(right-left)/2;

           if(a[mid]>=n)

           {

               right=mid;

           }

           else left=mid+1;

       }

       printf("%d\n",right);

   }

}
View Code

 

你可能感兴趣的:(HDU)