Problemi 060
Kërkesa
Alisa është zënë me Blertën këto kohët e fundit dhe s’do të ketë më punë me të. Ato kanë secila një grup me numra natyrorë. Numrat e Alisës janë \(A_1, A_2, ... , A_N\), kurse numrat e Blertës janë \(B_1, B_2, ..., B_M\). Tani Alisa do që të fshijë të gjithë numrat në grupin e saj që janë të përbashkët me numrat e Blertës. Sa është numri më i vogël i numrave që duhet të fshijë Alisa?
Referenca: https://www.codechef.com/problems/NOTINCOM
Shembull
$ cat input.txt
2
3 4
1 2 3
3 4 5 6
3 3
1 2 3
4 5 6
$ python3 prog.py < input.txt
1
0
Zgjidhja 1
for _ in range(int(input())):
n, m = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
nr = 0
for a in A:
if a in B:
nr += 1
print(nr)
Sqarime
Kjo zgjidhje është llogjikisht e thjeshtë: për çdo element të listës A kontrollojmë nëse ndodhet edhe në B. Kompleksiteti është i rendit \(O(N*M)\), meqenëse kemi një cikël që përsëritet N herë, dhe brenda tij kërkojmë në një listë që ka M elementë.
Po ta testojmë: https://www.codechef.com/submit/NOTINCOM kjo zgjidhje kalon vetëm testin e vogël dhe merr vetëm gjysmat e pikëve.
Zgjidhja 2
for _ in range(int(input())):
n, m = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
A.sort()
B.sort()
nr = 0
i = 0
j = 0
while i < n and j < m:
if A[i] == B[j]:
nr += 1
i += 1
elif A[i] < B[j]:
i += 1
else:
j += 1
print(nr)
Sqarime
Kjo zgjidhje duket pak më e ndërlikuar se e para, por është më e shpejtë. Kjo zgjidhje i kalon të dyja grupet e testimit: https://www.codechef.com/submit/NOTINCOM
Fillimisht renditen të dyja listat dhe pastaj kontrollohet për të parë se sa elemente janë të barabarta midis tyre. Renditjen e listave ne e bëjmë me funksione të gatshme, por një renditje e shpejtë zakonisht merr një kohë të rendit \(O(N*ln(N))\). Kështu që në total, koha që i duhet programit është përafërsisht: \(O(N*ln(N)) + O(M*ln(M) + N + M)\), ose përafërsisht \(O(N*ln(N))\) (nqs supozojmë që \(N \approx M\)). Kjo kohë është më e mirë se koha e zgjidhjes së mëparshme \(O(N^2)\) (nqs supozojmë që \(N \approx M\)).
Detyra
Nga rezultatet e një olimpiade mund të hamendësojmë nivelin e aftësive për secilin pjesëmarrës. Pjesëmarrësit mund të klasifikohen bazuar në numrin e problemave të zgjidhura në këtë mënyrë:
- 0 problema të zgjidhura: Beginner
- 1 problem të zgjidhur: Junnior Developper
- 2 problema të zgjidhura: Middle Developer
- 3 problema të zgjidhura: Senior Developer
- 4 problema të zgjidhura: Hacker
- 5 problema të zgjidhura: Jeff Dean
Bëni një program që merr rezultatet e pjesëmarrësve dhe nxjerr klasifikimin e tyre.
Referenca: https://www.codechef.com/problems/CCOOK
Shembull
$ cat input.txt
7
0 0 0 0 0
0 1 0 1 0
0 0 1 0 0
1 1 1 1 1
0 1 1 1 0
0 1 1 1 1
1 1 1 1 0
$ python3 prog.py < input.txt
Beginner
Middle Developer
Junior Developer
Jeff Dean
Senior Developer
Hacker
Hacker