Can someone please help me in solving D. of today's Atcoder beginner contest.
Editorials are not available in English and I am not able to approach this problem on my own.
# | User | Rating |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3821 |
3 | Benq | 3736 |
4 | Radewoosh | 3631 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3388 |
10 | gamegame | 3386 |
# | User | Contrib. |
---|---|---|
1 | cry | 164 |
1 | maomao90 | 164 |
3 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | -is-this-fft- | 158 |
6 | awoo | 157 |
7 | adamant | 156 |
8 | TheScrasse | 154 |
8 | nor | 154 |
10 | Dominater069 | 153 |
Can someone please help me in solving D. of today's Atcoder beginner contest.
Editorials are not available in English and I am not able to approach this problem on my own.
Name |
---|
Here is my solution which is different from the official one. (My English is very poor, sorry)
Let
dp[i][j]
be the maximum number of digits of the answer, which is made with i matches and has j as the first(highest) digit.Thus we can easily get
dp[i + c[A[k]]][A[k]] = max(dp[i + c[A[k]]][A[k]], dp[i][A[j]] + 1)
, whereA[i]
means the i-th available digit andc[i]
means the cost of digit i.Finally, we can greedily output the answer. For i, the number of matches left now, consider a best j with max{f[i][j]}. If there exists some js with the same value, just use the maximum j. This strategy is correct, because when we compare two numbers, we first consider their total length, and then from high digits to low digits.
Here is my solution for a better understanding :)
how u store so large numbers and why u dont use recursive approach
You don't need to actually store the whole number, instead, you split it in into digits.
As for the way to achieve the algorithm, you can use recursive approach if you like. It doesn't matter.
The main insight for these type of questions where you must output a big integer that is maximum is to first maximize length. If there are multiple answers of the same length, break ties by choosing the lexicographically larger number.
I maintained two arrays. F(i) represents the maximum length possible with exact cost i A(i, d) represents the length of the number with total cost i and last digit d.
Here is my code and explanation.