Problemi 084
Kërkesa
Në një varg numrash natyrorë \(A_1, A_2, ..., A_n\) gjeni vlerën më të madhe të shprehjes \(A_i mod A_j\) (mbetja e pjesëtimit të \(A_i\) me \(A_j\)) për çdo vlerë të i dhe j.
Referenca: https://www.codechef.com/APRIL19B/problems/MAXREM
Shembull
$ cat input.txt
2
5
1 2 3 4 5
6
5 5 5 2 3 8
$ python3 prog.py < input.txt
4
5
Zgjidhja 1
for _ in range(int(input())):
n = int(input())
L = [int(i) for i in input().split()]
m = 0
for i in range(n):
for j in range(n):
if L[i] % L[j] > m:
m = L[i] % L[j]
print(m)
Sqarime
Zgjidhja naive, duke i gjetur të gjitha mbetjet e mundshme dhe duke marrë maksimumin e tyre, është me kohë të rendit \(O(N^2)\), dhe shumë e ngadalshme për vlera të mëdhaja të N.
Zgjidhja 2
for _ in range(int(input())):
n = int(input())
L = [int(i) for i in input().split()]
L.sort()
m = 0
for i in range(n-1, 0, -1):
m = L[i-1] % L[i]
if m > 0:
break
print(m)
Sqarime
Vëmë re që nëse \(a < b\), atere a % b = a
. Kështu që për të gjetur
mbetjen më të madhe mjafton që ti rendisim numrat dhe të marrin numrin
e parafundit. Vetëm se kjo nuk funksionon nëse dy numrat e fundit
qëllon të jenë të barabartë. Në këtë rast duhet marrë numri i parë që
nuk është i barabartë me numrin e fundit. Gjithashtu duhet të kemi
parasysh edhe rastin që të gjithë numrat mund të jenë të barabartë.
Koha mbizotëruese në këtë zgjidhje është koha që duhet për të renditur numrat, e cila zakonisht është e rendit \(O(N*log(N))\), pra më e mirë se zgjidhja e parë.
Zgjidhja 3
for _ in range(int(input())):
n = int(input())
L = [int(i) for i in input().split()]
L.sort()
i = n - 2
while i > 0 and L[i] == L[i+1]:
i -= 1
print(L[i] % L[i+1])
Sqarime
E njëjtë si zgjidhja 2, vetëm se e shkruar pak më ndryshe.
Detyra
Regjistrimi në shkollën e lartë bëhet me anë të konkursit. Gjithsej zhvillohen E provime, ku pikët maksimale në çdo provim janë M, dhe merret shuma e pikëve të tyre. Nga N studentë që hyjnë në provime, vetëm K prej tyre që kanë marrë në total më shumë pikë se të tjerët mund të regjistrohen.
Ju i dini pikët që kanë marrë konkurrentët e tjerë në E-1 provimet e mëparshme. Gjithashtu, me një program të inteligjencës artificiale keni parashikuar edhe pikët që do marrin konkurrentët e tjerë në provimin e fundit. Gjeni se sa janë pikët minimale që duhet të merrni në provimin e fundit, në mënyrë që të hyni në shkollë të lartë. Nëse kjo është e pamundur programi duhet të nxjerrë ‘Impossible’.
Referenca: https://www.codechef.com/problems/ENTEXAM
Shembull
$ cat input.txt
1
4 2 3 10
7 7 7
4 6 10
7 10 9
9 9
$ python3 prog.py < input.txt
4
Kemi 1 rast testimi. Rreshti i parë na jep numrat N=4, K=2, E=3, M=10. Katër rreshtat e tjerë na japin pikët që kanë marrë studentët e tjerë në E=3 provimet që janë zhvilluar, me përjashtim të rreshtit të fundit, i cili jep pikët tuaja në E-1 provimet e kaluara. Pikët totale të konkurentëve të tjerë janë 7+7+7=21, 4+6+10=20, dhe 7+10+9=26. Meqenëse vetëm K=2 veta do jenë fitues, juve ju duhen të paktën 22 pikë për të fituar. Deri tani keni marrë 9+9=18 pikë, kështu që në provimin e fundit duhet të merrni të paktën 4 pikë.