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:
Bulbo
Maze
Finding repetitions
Letters Removing
Floyd-Warshall - finding all shortest paths
Convex hull trick and Li Chao tree
Challenges in school №41
String Hashing
Long Path
Kay and Eternity
Dividing Kingdom
Ehab's Last Theorem
Double Elimination
Suns and Rays
Bear and Forgotten Tree 3
Fox And Travelling
Bears and Juice
Felicity's Big Secret Revealed
Frets On Fire
New Year and the Christmas Ornament
Bingo!
Morning run
Check if two segments intersect
Longest Saw
Likes Display
Learning and Improving Algorithm through contests - Antti Laaksonen
Cron
Ternary Search
Balls and Boxes
Fence Planks
Breadth-first search
Field expansion