poj 1019 Number Sequence

来源:互联网 发布:服装行业大数据分析 编辑:程序博客网 时间:2024/04/25 01:46

不知道这题应该怎么写,我写了一个很丑陋的模拟。32ms,1次ac。但是实在很丑。
/* * Author: stormdpzh * POJ: 1019 Number Sequence * Created Time: 2012/5/16 20:07:37 */#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <algorithm>#include <functional>#define sz(v) ((int)(v).size())#define rep(i, n) for(int i = 0; i < n; i++)#define repf(i, a, b) for(int i = a; i <= b; i++)#define repd(i, a, b) for(int i = a; i >= b; i--)#define out(n) printf("%d\n", n)#define wh(n) while(scanf("%d", &n) != EOF)#define whz(n) while(scanf("%d", &n) != EOF && n != 0)#define lint long longusing namespace std;const lint MaxN = 100005;lint digit[MaxN];lint rec[MaxN];lint n;void init(){    memset(digit, 0, sizeof(digit));    memset(rec, 0, sizeof(rec));    lint tmp = 0;    for(lint i = 1; i < MaxN; i++) {        tmp++;        digit[i] = tmp;        lint total = 0;        lint tmp_digit = tmp;        while(tmp_digit > 0) {            total++;            tmp_digit /= 10;        }        rec[i] = rec[i - 1] + total;    }}lint getDigit(lint x){    lint res = 0;    while(x > 0) {        res++;        x /= 10;    }    return res;}int gao(){    lint tmp = 0;    for(lint i = 1; i < MaxN; i++) {        if(tmp + rec[i] >= n) {            lint leave = n - tmp;            lint tmp = 0;            for(lint l = 1; l <= digit[i]; l++) {                int cur_digit = getDigit(l);                tmp += cur_digit;                   if(tmp >= leave) {                    int tmp_res[6];                    lint j = l;                    int k = 0;                    while(j > 0) {                        tmp_res[k++] = j % 10;                        j /= 10;                    }                    lint tmp_leave = leave - (tmp - cur_digit);                    for(k--; k >= 0; k--) {                        if(tmp_leave == 1) return (int)tmp_res[k];                        tmp_leave--;                    }                }             }        }        tmp += rec[i];    }}int main(){    init();                 int t;    scanf("%d", &t);    while(t--) {        scanf("%d", &n);        out(gao());    }    return 0;}