首页 > 代码库 > hdu4151(二分)

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 10000000using 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

 

hdu4151(二分)