forked from KirarinSnow/Google-Code-Jam
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathD.py
executable file
·62 lines (53 loc) · 1.61 KB
/
D.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python
#
# Problem: Travel Plan
# Language: Python
# Author: KirarinSnow
# Usage: python thisfile.py <input.in >output.out
for case in range(int(raw_input())):
n = int(raw_input())
x = map(int, raw_input().split())
f = int(raw_input())
x.sort()
if 2*(x[n-1]-x[0]) > f:
ans = "NO SOLUTION"
else:
n1 = n/2
n2 = n-n1
x1 = x[:n1]
x2 = x[n1:][::-1]
ans = -1
for v in range(2, 2*n1+2, 2):
s = []
a = []
for p in range(2):
ni = (n1, n2)[p]
y = (x1, x2)[p]
s.append(set())
k = [(0, 2)]
for i in range(1, ni):
kk = []
for t, w in k:
if abs(w-v) <= 2*(ni-i):
tt = t+w*abs(y[i]-y[i-1])
for ww in range(max(2, w-2), w+4, 2):
kk.append((tt, ww))
k = kk
for t, w in k:
s[-1].add(t)
a.append(sorted(list(s[-1])))
h = v*(x2[n2-1]-x1[n1-1])
for r in a[0]:
l = 0
u = len(a[1])
while l < u-1:
m = (l+u)/2
z = r+a[1][m]+h
if z > f:
u = m
else:
l = m
c = r+a[1][l]+h
if c <= f:
ans = max(ans, c)
print "Case #%d: %s" % (case+1, ans)