hdu4151(二分)

时间:2024-05-19 12:35:50

题目链接: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[],tot;
int vis[];
void init()
{
tot=;
for(int i=;i<=N;i++)
{
int temp=i;
memset(vis,,sizeof(vis));
while(temp)
{
int t=temp%;
if(!vis[t])vis[t]=;
else break;
temp/=;
}
if(!temp)a[tot++]=i;
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)>)
{
// printf("%d\n",lower_bound(a,a+tot,n)-a);
int left=,right=tot,ans=;
while(left<right)
{
int mid=left+(right-left)/;
if(a[mid]>=n)
{
right=mid;
}
else left=mid+;
}
printf("%d\n",right);
}
}