在今年培训前期做的题目,那时感觉不会做,邀请了萝卜兄弟帮忙解决,现在看来确实是道水题。屁颠屁颠的AC了。
这题直接记录整个连续区间的值,把前面连续的去掉,留下最后一段不连续的,就可以用O(1)的算法了。这种思想以前也遇到过,做的题多了就有感觉吧。不错不错。
不过还是调了很久1Y;
#include<iostream>
#include<stdio.h>
#define MAXN 150000
#define MAXM 32000
using namespace std;
int map[MAXN];
long long index[MAXM];
int main()
{
int T,i,j,k;
scanf( "%d",&T );
long long cnt=0;
int length,len;
long long sum=0;
index[0]=0;
for( i=1;;i++ )
{
if( i>9999 ) length=5;
else if( i>999 ) length=4;
else if( i>99 ) length=3;
else if( i>9 ) length=2;
else length=1;
index[i]=index[i-1]+length;
sum+=index[i];
if( sum>2147483647 ) break;
j=i;len=length;
while( length )
{
map[cnt+length]=j%10;
j/=10;
length--;
}
cnt+=len;
}
while( T-- )
{
int num;
scanf( "%d",&num );
for( i=1;;i++ )
{
if( num-index[i]>0 )
num-=index[i];
else
break;
}
printf( "%d\n",map[num] );
}
return 0;
}