Problemi 040
Kërkesa
Një listë L ka N numra të plotë të ndryshëm nga zero. Një nën-listë quhet alternuese nëse çdo dy elemente fqinje të listës kanë shenja të kundërta (njëra pozitive dhe tjetra negative).
Për çdo element të listës L gjeni gjatësinë e nën-listës alternuese më të madhe që fillon me atë element.
Referenca: https://www.codechef.com/problems/ALTARAY
Shembull
$ cat input.txt
3
4
1 2 3 4
4
1 -5 1 -5
6
-5 -1 -1 2 -2 -3
$ python3 prog.py < input.txt
1 1 1 1
4 3 2 1
1 1 3 2 1 1
Zgjidhja 1
T = int(input())
for t in range(T):
N = int(input())
L = list(map(int, input().split()))
P = []
for i in range(N):
k = 1
while i+k < N and L[i+k-1]*L[i+k] < 0:
k += 1
P.append(k)
print(*P)
Sqarime
Për çdo element të listës gjejmë se sa elemente alternuese janë mbas
tij. Kushtin i+k < N
e përdorim për tu siguruar që indeksi
(treguesi) i+k
nuk del jashtë listës. Kurse kushtin x*y < 0
e
përdorim për të kontrolluar që dy elementë kanë shenja të kundërta.
Komanda print(*P)
përdoret për të printuar elementet e një liste, të
ndarë me vende bosh.
Zgjidhja 2
T = int(input())
for t in range(T):
N = int(input())
L = list(map(int, input().split()))
P = []
for i in range(N):
P.append(0)
L.append(L[-1])
i = N
while i > 0:
if L[i-1] * L[i] < 0:
P[i-1] = P[i] + 1
else:
P[i-1] = 1
i -= 1
print(*P)
Sqarime
Kjo zgjidhje bazohet në faktin që gjatësitë e nën-listave më të mëdha
alternuese për dy elemente të një-pas-njëshëm i
dhe i+1
kanë
lidhje me njëra-tjetrën. Nëse elementët i
dhe i+1
kanë shenja të
kundërta, atëherë gjatësia për elementin i
është një më tepër sesa
për elementin i+1
. Nëse kanë shenja të njëjta, atere është 1
.
Kështu që zgjidhja bëhet duke filluar nga fundi i listës dhe duke llogaritur gjatësinë për një element duke u bazuar te gjatësia e elementit pasardhës. Elementi i fundit i listës përbën një rast të veçantë, sepse nuk ka element para-ardhës, kështu që ne shtojmë një element fallco në fund të listës, thjesht për të shmangur trajtimin e tij si rast i veçantë.
Kjo zgjidhje mund të duket pak më e vështirë për tu konceptuar në krahasim me zgjidhjen e parë, por në fakt është më e shpejtë. Zgjidhja e parë është zgjidhje katrore (ose e rendit \(O(N^2)\)) meqenëse kemi dy cikle brenda njëri-tjetrit. Kurse kjo zgjidhje është lineare (ose e rendit \(O(N)\)) meqenëse kemi vetëm një cikël.
Që zgjidhja e dytë është më e shpejtë mund ta provoni edhe duke i provuar këto zgjidhje këtu: https://www.codechef.com/submit/ALTARAY Zgjidhja e parë nuk e kalon testin sepse është shumë e ngadalshme, kurse e dyta po.
Detyra
Një listë L ka N numra të plotë të ndryshëm nga zero. Një nën-listë quhet alternuese nëse çdo dy elemente fqinje të listës kanë shenja të kundërta (njëra pozitive dhe tjetra negative).
Gjeni gjatësinë e nën-listës alternuese më të madhe të listës L.
Shembull
$ cat input.txt
3
4
1 2 3 4
4
1 -5 1 -5
6
-5 -1 -1 2 -2 -3
$ python3 prog.py < input.txt
1
4
3