forked from istvan-olah/CCC34
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlevel5.py
82 lines (68 loc) · 2.6 KB
/
level5.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def readFile(file):
file1 = open("inputs/" + file + ".in", 'r')
lines = file1.readlines()
file1.close()
return [line.replace("\n", "").replace("\t", "") for line in lines]
def getMinutes(minutes):
return [(key, int(value),) for key, value in enumerate(minutes, 0)]
def getTasks(tasks):
return [[int(line.split(" ")[0]), int(line.split(" ")[1]), int(line.split(" ")[2]), int(line.split(" ")[3]), []]
for
line in tasks]
def writeOutput(lines, file):
with open(f"outputs/{file}.out", 'w') as out_file:
for line in lines:
out_file.write(f"{line}\n")
def getSortedMinutes(minutes):
return sorted(getMinutes(minutes), key=lambda tup: tup[1])
def getCheapest(minutes, task, timeline):
interval = minutes[task[2]: task[3] + 1]
sorted_interval = sorted(interval, key=lambda tup: tup[1])
power_needed = task[1]
index = 0
while power_needed > 0 and index < len(sorted_interval):
minute = sorted_interval[index]
remained_on_time = timeline[minute[0]][0]
remained_nr = timeline[minute[0]][1]
if remained_on_time > 0 and remained_nr > 0:
if remained_on_time > power_needed:
timeline[minute[0]][0] = remained_on_time - power_needed
task[1] = 0
task[4].append(f"{minute[0]} {power_needed}")
else:
task[1] = power_needed - remained_on_time
timeline[minute[0]][0] = 0
task[4].append(f"{minute[0]} {remained_on_time}")
timeline[minute[0]][1] -= 1
index += 1
power_needed = task[1]
if power_needed > 0:
raise Exception(f"Error mate at task {task[0]}")
return f"{task[0]} " + " ".join(task[4])
def level5(file):
content = readFile(file)
max_power = int(content[0])
max_bill = int(content[1])
threshold = int(content[2])
minutes_count = int(content[3])
timeline = []
for i in range(minutes_count):
timeline.append([max_power, threshold])
minutes = content[4:minutes_count + 4]
minutes = getMinutes(minutes)
tasks_count = content[minutes_count + 1]
tasks = content[minutes_count + 5:]
tasks = getTasks(tasks)
sorted_tasks = sorted(tasks, key=lambda task: task[3] - task[2])
lines = [len(tasks)]
for task in sorted_tasks:
line = getCheapest(minutes, task, timeline)
lines.append(line)
writeOutput(lines, file)
if __name__ == '__main__':
# level5("level5_example")
# level5("level5_1")
level5("level5_2")
# level5("level5_3")
# level5("level5_4")
# level5("level5_5")