Prof. Vasechkin wants to represent positive integer n as a sum of addends, where each addends is an integer number containing only 1s. For example, he can represent 121 as 121=111+11–1. Help him to find the least number of digits 1 in such sum.
Input
The first line of the input contains integer n (1 ≤ n < 1015).
Output
Print expected minimal number of digits 1.
Examples
input
121
output
6
Solution:
import java.lang.Math.abs
private fun readLn() = readLine()!! // string line
private fun readInt() = readLn().toInt() // single int
private fun readLong() = readLn().toLong() // single long
private fun readDouble() = readLn().toDouble() // single double
private fun readStrings() = readLn().split(" ") // list of strings
private fun readInts() = readStrings().map { it.toInt() } // list of ints
private fun readLongs() = readStrings().map { it.toLong() } // list of longs
private fun readDoubles() = readStrings().map { it.toDouble() } // list of doubles
fun main(args: Array<String>) {
var s = readLn().reversed() + "000"
var len = s.length
val MAX = 200
var dp = Array(len + 1, { Array(2 * MAX, { IntArray(2 * MAX, { 12345 }) }) })
dp[0][MAX][MAX] = 0
for (i in 0..len - 1) {
for (cur in -MAX..MAX-1) {
for (carry in -MAX..MAX-1) {
var ft = dp[i][cur + MAX][carry + MAX]
if (ft == 12345) {
continue
}
for (delta in -100..100) {
var newCur = cur + delta
var here = newCur + carry
var value = (here % 10 + 10) % 10
if (value != s[i] - '0') {
continue
}
var newCarry = (here - value) / 10
var newFt = ft + abs(delta) * i
if (newCur >= -MAX && newCur < MAX && newCarry >= -MAX && newCarry < MAX && newFt < dp[i + 1][newCur + MAX][newCarry + MAX]) {
dp[i + 1][newCur + MAX][newCarry + MAX] = newFt
}
}
}
}
}
println(dp[len][MAX][MAX])
}
Related posts:
Resource Distribution
Digits
Tree and XOR
Interesting Subarray
Deduction Queries
Josephus Problem
Banana
Finding bridges in a graph in $O(N+M)$
PolandBall and Polygon
Points on Line
Rock Is Push
Power Tree
New Year and the Factorisation Collaboration
Princesses and Princes
Wilbur and Trees
Dynamic Programming on Broken Profile
Fair
Barcode
Another One Bites The Dust
Merging Two Decks
Depth First Search
Interactive LowerBound
Falling Blocks
Spyke Talks
K-Complete Word
Farewell Party
Egg Roulette
Colorado Potato Beetle
Likes Display
Lazy Security Guard
Manacher's Algorithm - Finding all sub-palindromes in $O(N)$
Travelling Through the Snow Queen's Kingdom