Digit Generator UVA-1583
Topic Portal:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem= 4458
The main idea: Generate a meta, the value of a number x is another number y value plus y of the sum of the number of members;
216 = 198 + 1 + 9 + 8;
2005 = 1979 + 1 + 9 + 7 + 9;
........
Analysis: Are we going to enumerate all the numbers that are smaller than x, and compare them to see which one is its generator?
This is too complicated, time-consuming and laborious;
Another way is to make a table, yes first let the background compiler to preprocess a batch of data, and then we directly check the table is good;
How to make a watch.
We'll start by test instructions a table of size 10086;
int ans[10086];
for (int i = 0; i < 10086; i++)//full
{
int x = i, y = i;
while (x > 0) {y + = x%10; x/= 10}//current digit x is taken apart and added, note that it is added on the basis of Y, because we are directly going to achieve the purpose of "ans[y] = Y's generator";
if (ans[y] = = 0 | | I < ans[ Y])//assignment, and according to the test instructions to small (we I from small to big add up, so there is no need to judge the small, but add to complete)
ans[y] = i;
}
At this time, ans[] is a form that meets our requirements;
There is a lot of data is very large, but also need to query the comparison of the topic, you can pre-preprocess a table to solve, will save a lot of time, efficiency significantly increased;
The following is an AC Code:
#include <bits/stdc++.h> using namespace std; int ans[100086];
void MakeList ()//Hit table {for (int i = 0; i < 100086; i++) {int x = I,y = i;
while (x > 0) {y + = x%10;
x/= 10;
} if (ans[y] = = 0 | | ans[y] > i) ans[y] = i;
}} int main () {int m,n;
memset (ans,0,sizeof (ans));
MakeList ();
cin>>n;
while (n--) {cin>>m;
cout<<ans[m]<<endl;
} return 0; }