POJ3725-I know the k-th integer

来源:互联网 发布:依存度算法 编辑:程序博客网 时间:2024/06/06 03:30


题目链接:http://poj.org/problem?id=3725

题意描述:就是对于n个数,按字典序排序,如果给出第k位的数字m,求出最小的n。
题意分析:分两种情况判断,先判断n不存在的情况。如果当n=m时,m排在t位上,如果k<t,那么n不存在。还有如果m是10的几次方时,k=t时n才存在,一开始没有单独判断这种情况,结果WA了。然后判断n存在的情况下,如果从m++一位一位判断找,铁定会超时。这里有一个技巧,比方说第三组测试数据25吧,250前的数肯定在25前,2500前的数也肯定在25前,所以,你懂的、、


代码如下:



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


__int64 wei( __int64 m ){
    __int64 i, cnt = 0, mm = m;
    while( mm ){
        cnt ++;
        mm /= 10;
    }
    //mm = pow( 10,cnt-1 );
    mm = 1;
    for( i=1; i<cnt; i++ )
        mm *= 10;
    return m - mm + 1;
}


__int64 Init( __int64 m ){
    __int64 r = 0;
     while( m ) {
         r += wei( m );
        m /= 10;
    }
    return r;
}


int check( __int64 m, __int64 k, __int64 cmp ){
    __int64 cnt = 0;
    __int64 mm = m;
    while( mm != 1 ){
        if( mm % 10 == 0 ){
            cnt ++;
            mm /= 10;
        }
        else
            return 0;
    }
    if( k == cmp )
        printf( "%I64d\n", m );
    else
        printf( "0\n" );
    return 1;
}


void fac( __int64 n, __int64 k, __int64 t ){
    __int64 m = n;
    __int64 cnt, s, cmp;
    while( k != t ){
        cmp = t;
        s = wei( m*10 ) -1 + t;
        if( s < k ){
            m = m*10;
            t = s;
        }
        else{
            __int64 mm = m;
            cnt = 0;
            while( mm ){
                cnt ++;
                mm /= 10;
            }
            //__int64 num = pow( 10, cnt );
            __int64 i,num = 1;
            for( i=1; i<=cnt; i++ )
                num *= 10;
            cnt = num + k - cmp - 1;
            break;
        }
    }
    printf( "%I64d\n", cnt );
}


int main(){
    __int64 k,m;
    while( scanf( "%I64d%I64d", &k, &m ) != EOF ){
        __int64 cmp = Init( m );
        if( cmp > k ){
            printf( "0\n" );
            continue;
        }
        if( check( m, k, cmp ) ){
            continue;
        }
        fac( m, k, cmp );
    }
    return 0;
}
原创粉丝点击