| Task: | Numerot |
| Sender: | Metabolix |
| Submission time: | 2020-10-18 10:32:13 +0300 |
| Language: | Python3 (CPython3) |
| Status: | READY |
| Result: | 0 |
| group | verdict | score |
|---|---|---|
| #1 | TIME LIMIT EXCEEDED | 0 |
| #2 | TIME LIMIT EXCEEDED | 0 |
| #3 | TIME LIMIT EXCEEDED | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | TIME LIMIT EXCEEDED | -- | 1, 2, 3 | details |
| #2 | TIME LIMIT EXCEEDED | -- | 2, 3 | details |
| #3 | TIME LIMIT EXCEEDED | -- | 3 | details |
Code
#!/usr/bin/python3
def f(luku, maxnum = 0, cache = dict()):
key = (maxnum, luku)
if key in cache:
return cache[key]
if luku < maxnum:
return 1, -maxnum
if luku <= 9:
if maxnum == 0:
return 1, -luku
return 2, -(luku + maxnum)
askelia = 0
muutos = 0
while luku > 9:
s = str(luku)[::-1]
muutettu = False
for i in range(1, len(s) - 1):
if s[i] != "0":
newmaxnum = max(maxnum, max(int(s[j]) for j in range(i+1, len(s))))
a, m = f(luku % (10**(i+1)), newmaxnum)
askelia += a
muutos += m
luku += m
muutettu = True
break
if not muutettu:
askelia += 1
num = max(maxnum, int(s[-1]), int(s[0]))
muutos -= num
luku -= num
cache[key] = askelia, muutos
return cache[key]
def helppo(alkumax, ylin, nollia, alin, cache = dict()):
key = (alkumax, ylin, nollia, alin)
if key in cache:
return cache[key]
askelia, muutos = 0, 0
while ylin > 0:
# Nyt luku on muotoa {ylin}00000{alin}
# Aiheutetaan kymmenylitys, jossa ylin laskee yhdellä.
maxnum = max(alkumax, ylin, alin)
if maxnum <= alin:
maxnum2 = max(alkumax, ylin, alin - maxnum)
askelia += 2
muutos -= maxnum + maxnum2
alin = (alin - maxnum - maxnum2) % 10
else:
askelia += 1
muutos -= maxnum
alin = (alin - maxnum) % 10
ylin -= 1
if nollia > 0:
# Nyt luku on muotoa {ylin}99999{alin}
# Tuhotaan yhdeksiköt pienimmästä alkaen.
for i in range(nollia - 1):
maxnum = 9
a, m = helppo(9, 9, i, alin)
askelia += a
muutos += m
alin = (alin + m) % 10
# Nyt luku on muotoa {ylin}90000{alin}
i = nollia - 1
maxnum = max(alkumax, ylin)
a, m = helppo(maxnum, 9, i, alin)
askelia += a
muutos += m
alin = (alin + m) % 10
val = (askelia, muutos)
cache[key] = val
return val
def f(luku, maxnum = 0, cache = dict()):
askelia, muutos = 0, 0
kymppi = 10
nollia = 0
while luku > 9:
ylin = luku // kymppi % 10
alin = luku % 10
alkumax = max(int(i) for i in str(luku // kymppi // 10))
a, m = helppo(max(maxnum, alkumax), ylin, nollia, alin)
askelia += a
muutos += m
luku += m
kymppi *= 10
nollia += 1
return askelia, muutos
#print((10812292252, -91723876114), "oikea")
#print(f(91723876123, 0), "laskettu")
#print((1092, -9828), "oikea")
#print(f(9829, 9), "laskettu")
def g(x):
return f(x)[0] + 1
t = int(input())
for _ in range(t):
x = int(input())
if x == 1:
print(1)
continue
k0, k1 = 9, 10**19
while (k1 - k0) > 1:
k = (k1 + k0) // 2
if g(k) < x:
k0 = k
else:
k1 = k
print(k1)
Test details
Test 1
Group: 1, 2, 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 1000 1 2 3 4 ... |
| correct output |
|---|
| 1 10 11 20 22 ... |
| user output |
|---|
| (empty) |
Test 2
Group: 2, 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 1000 224995 413660 249827 2125 ... |
| correct output |
|---|
| 1731724 3216040 1940719 14585 532612 ... |
| user output |
|---|
| (empty) |
Test 3
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 1000 627887018110416188 785474884983906653 653772166720939773 784335285960673683 ... |
| correct output |
|---|
| 5530371754830260284 6918696171534226533 5757755627065159149 6908439780325129803 3223801064342340738 ... |
| user output |
|---|
| (empty) |
