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;}