HDU4151 The Special Number

题目链接

 分析:

本题难点在于看不懂题(英语真的很重要)。

该题是输出小于n的special number的数量(quantity)。

暴力+二分。

AC代码如下:

#include <stdio.h>
#include <string.h>

#define MAXN 10000010

int q[MAXN];
unsigned char hash[11];

int main(){
    int n, i, t, top=0, high, low, mid, pos;

    for(i=1; i<=MAXN; i++){
        memset(hash, 0, sizeof(hash));
        t = i;
        while(t){
            if(!hash[t%10]){
                hash[t%10] = 1;
                t /= 10;
            }
            else break;
        }
        if(t == 0) q[top++] = i;
    }

    while(scanf("%d", &n) == 1){
        if(n<=1){printf("0\n"); continue;}
        high = top; low = 0;
        while(low<high){
            mid = low + (high-low)/2;
            if(q[mid] == n){pos = mid; break;}
            if(q[mid]>n) {high = mid;}
            else{low = mid+1; pos = low;}
        }
        printf("%d\n", pos);
    }

    return 0;
}

 不过有个问题:

如果将代码改为

if(q[mid]>n) {high = mid; pos = mid;}
else low = mid+1;

会报错,目前不清楚原因。也许是对二分的细节不太了解?回头研究下。

posted on 2013-03-11 22:38  Still_Raining  阅读(242)  评论(0编辑  收藏  举报