09.1, 09.2 python
This commit is contained in:
@@ -42,26 +42,32 @@ def fat(data):
|
|||||||
n = 0
|
n = 0
|
||||||
for i in range(len(data)):
|
for i in range(len(data)):
|
||||||
if i%2==0:
|
if i%2==0:
|
||||||
files.append((n, l, l+data[i]))
|
files.append([n, l, l+data[i]])
|
||||||
n += 1
|
n += 1
|
||||||
else:
|
else:
|
||||||
emptys.append((l, l+data[i]))
|
emptys.append([l, l+data[i]])
|
||||||
l += data[i]
|
l += data[i]
|
||||||
return files, emptys
|
return files, emptys
|
||||||
|
|
||||||
|
def t(files):
|
||||||
|
return sum(n*(s+e-1)*(e-s)//2 for n, s, e in files)
|
||||||
def f2(files, emptys):
|
def f2(files, emptys):
|
||||||
for i in reversed(range(len(files))):
|
M = len(emptys)
|
||||||
n, s, e = files[i]
|
i = len(files)-1
|
||||||
j = 0
|
for _, s, e in reversed(files):
|
||||||
l, r = emptys[0]
|
for j, (l, r) in enumerate(emptys):
|
||||||
while not (j==len(emptys) or e-s<=r-l or s<l):
|
if e-s<=r-l or s<l:
|
||||||
j += 1
|
break
|
||||||
l, r = emptys[j]
|
|
||||||
if e-s<=r-l:
|
if e-s<=r-l:
|
||||||
files[i] = (n, l, l+e-s)
|
files[i][1] = l
|
||||||
emptys[j] = (l+e-s, r)
|
files[i][2] = l+e-s
|
||||||
return sum(n*(sum(range(s, e))) for n, s, e in files)
|
emptys[j][0] = l+e-s
|
||||||
|
i -= 1
|
||||||
|
return t(files)
|
||||||
|
|
||||||
assert f2(*fat("2333133121414131402"))==2858
|
assert f2(*fat("2333133121414131402"))==2858
|
||||||
|
|
||||||
|
import cProfile
|
||||||
|
cProfile.run('f2(*fat(data))')
|
||||||
|
|
||||||
print(f2(*fat(data)))
|
print(f2(*fat(data)))
|
||||||
|
|||||||
Reference in New Issue
Block a user