UVA-1583 Digit Generator(线性模拟)_i++

 

 

UVA-1583 Digit Generator(线性模拟)_git_02

 

 

一拿到这个题,先想到的模拟就是对于每一个数都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\n",a[m]);
20 }
21 return 0;
22