题目链接:http://https://cn.vjudge.net/problem/UVA-1583
【题解】 题意是给你一个数m,让你找出一个数x,x加上x的各个数字之和等于这个数m,并且x要尽量小。
普遍的解法就是每给一个数m,从1到m-1遍历查找使得 i 加上各个数字之和等于m就输出,但是这也明显会TLE,因为范围是1E5,所以就要考虑优化, 因为没次找一个数都有遍历,所以我们可以考虑打表,把1e5的数都打出来,最后直接查表。
【AC代码】
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int m,n;
int ans[100005];
int main()
{
memset(ans,0,sizeof(ans));
for(int i=0;i<100005;i++)
{
int sum=i,x=i;
while(x)
{
sum+=x%10;
x/=10;
}
if(ans[sum]==0 || i<ans[sum]) ans[sum]=i;
}
while(~scanf("%d",&m))
{
while(m--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
}
return 0;
}