一拿到这个题,先想到的模拟就是对于每一个数都n从1到n枚举一遍然后去找,很显然这是铁TLE的。
我很会发现,这种算法,一个数会被操作很多遍(当遇到很多比它大的数的时候),而这个很多遍的重复会导致TLE。所以我们想着这些很多遍的操作如何能化简到1次。
一般按照题目思路,我们会对每一个n求他的合适的m,这需要枚举。那我们不妨换一个思路,反过来思考,枚举m,求m对应的n。这样就可将算法改进到线性。所以下次在遇到需要有很多重复的东西需要算的时候,可以枚举这个重复的东西,这样这个东西只要算一遍就行了qwq
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int MAX=100005; 4 int n,m,a[MAX]; 5 int main(){ 6 freopen ("digital.in","r",stdin); 7 freopen ("digital.out","w",stdout); 8 int i,j,x,y; 9 memset(a,0,sizeof(a)); 10 for (i=1;i<=1e5;i++){ 11 x=y=i; 12 while (x){y+=x%10;x/=10;} 13 if (y<=1e5 && a[y]==0) 14 a[y]=i; 15 } 16 scanf("%d",&n); 17 for (i=1;i<=n;i++){ 18 scanf("%d",&m); 19 printf("%d ",a[m]); 20 } 21 return 0; 22 }