Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import math as m
- import random
- # Functions
- def getRandomScanD(D, T):
- scanD = np.full(D, -1)
- d = 0
- indx = list(range(len(T)))
- while True:
- if len(T) < 1 or d >= len(scanD):
- return scanD
- n = random.randint(0, len(T)-1)
- scanD[d:d+T[n]] = indx[n]
- d += T[n]
- T = np.delete(T, n)
- indx = np.delete(indx, n)
- i = T < D-d
- T = T[i]
- indx = indx[i]
- def getYK(scanD, S, ID):
- Y = np.unique(scanD)
- Y = Y[ Y != -1]
- K = [[0]] * len(Y)
- for n,i in enumerate(Y):
- K[n] = [str(x) for _,x in sorted(zip(S[list(ID[i])], ID[i]),
- reverse = True)]
- return Y, K
- def rearrangeK(scanD, Y, M, K):
- D = len(scanD)
- nB = max([int(max(i)) for i in K])
- scanB = np.full(nB+1, 0)
- for ni1, Ki in enumerate(K):
- nD = D - (np.argwhere(scanD == Y[ni1])[-1] + 1)
- nK = nD * M[Y[ni1]]
- for ni2, k in enumerate(Ki):
- if ni2 > nK:
- K[ni1] = K[ni1][:nK[0]]
- break
- if (scanB[int(k)] == 1):
- Ki.append(Ki.pop(Ki.index(k)))
- scanB[int(k)] = 1
- return K
- def getScore(S, K):
- s = 0
- K = [i for k in K for i in k]
- K = np.array(K)
- K = np.unique(K)
- for k in K:
- s += S[int(k)]
- return s
- ## Read input
- filename = ['a_example.txt', 'b_read_on.txt', 'c_incunabula.txt',
- 'd_tough_choices.txt' ,'e_so_many_books.txt',
- 'f_libraries_of_the_world.txt']
- ans = ['a_ans.txt', 'b_ans.txt', 'c_ans.txt', 'd_ans.txt', 'e_ans.txt',
- 'f_ans.txt']
- inp = 2
- f = open(filename[inp], 'r')
- B, L, D = [int(x) for x in f.readline().split()]
- S = np.array([int(x) for x in f.readline().split()])
- N, T, M = np.full(L, 0), np.full(L, 0), np.full(L, 0)
- ID = np.full(L, set())
- for i in range(L):
- N[i], T[i], M[i] = [int(x) for x in f.readline().split()]
- ID[i] = set([int(x) for x in f.readline().split()])
- f.close()
- numIter = 100
- count = numIter
- maxScore = 0
- while (count):
- scanD = getRandomScanD(D, T.copy())
- Y, K = getYK(scanD, S, ID)
- K = rearrangeK(scanD, Y, M, K)
- s = getScore(S, K)
- count -= 1
- print(f'{count} {s}')
- if (s > maxScore):
- print('^^^^^')
- maxScore = s
- maxY = Y.copy()
- maxK = K.copy()
- count = numIter
- Y = maxY
- K = maxK
- f2 = open(ans[inp], 'w')
- f2.write(f'{len(Y)}\n')
- for n,i in enumerate(Y):
- f2.write(f'{i} {len(K[n])}\n')
- f2.write(f"{' '.join(K[n])}\n")
- f2.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement