Problemi 034

Kërkesa

Një sistem për menaxhimin e skedarëve të një projekti mban një listë të skedarëve të injoruar dhe një listë të skedarëve të gjurmuar (të ndjekur). Gjeni sa skedarë janë edhe të injoruar edhe të gjurmuar, dhe sa janë as të injoruar dhe as të gjurmuar.

Referenca: https://www.codechef.com/problems/VCS

Shembull

$ cat input.txt
2
7 4 6
1 4 6 7
1 2 3 4 6 7
4 2 2
1 4
3 4

$ python3 prog.py < input.txt
4 1
1 1

Kemi 2 raste testimi. Në rastin e parë kemi N=7 numri total i skedarëve (të etiketuar nga 1 deri në 7), M=4 numri i skedarëve të injoruar, dhe K=6 numri i skedarëve të gjurmuar. Më poshtë kemi 1 4 6 7 lista e skedarëve të injoruar, dhe 1 2 3 4 6 7 lista e skedarëve të gjurmuar. Po ti krahasojmë, shohim se skedarët 1 4 6 7 (pra 4 skedarë) janë edhe të injoruar edhe të gjurmuar, kurse skedari 5 (pra 1 skedar) nuk është as i injoruar as i gjurmuar.

Në rastin e dytë kemi gjithsej 4 skedarë, 2 të injoruar dhe 2 të gjurmuar. Nga këta vetëm skedari 4 (pra 1 skedar) është edhe i injoruar edhe i gjurmuar, kurse skedari 2 (pra 1 skedar) nuk është as i injoruar dhe as i gjurmuar.

Zgjidhja 1

for _ in range(int(input())):
    N, M, K = map(int, input().split())
    l1 = input().split()
    l2 = input().split()
    l1.sort()
    l2.sort()
    bashkimi = []
    prerja = []
    i = 0
    j = 0
    while i < M and j < K:
        if l1[i] == l2[j]:
            prerja.append(l1[i])
            bashkimi.append(l1[i])
            i += 1
            j += 1
        elif l1[i] < l2[j]:
            bashkimi.append(l1[i])
            i += 1
        else:
            bashkimi.append(l2[j])
            j += 1
    while i < M:
        bashkimi.append(l1[i])
        i += 1
    while j < K:
        bashkimi.append(l2[j])
        j += 1
    print(len(prerja), N - len(bashkimi))

Sqarime

Për të gjetur ata skedarë që janë edhe të injoruar edhe të gjurmuar, duhet të gjejmë prerjen e dy listave të dhëna.

Për të gjetur ata skedarë që nuk janë as të injoruar dhe as të gjurmuar, fillimisht gjejmë ata që janë të injoruar OSE të gjurmuar (bashkimin e dy listave të dhëna).

Zgjidhja 2

for _ in range(int(input())):
    N, M, K = map(int, input().split())
    s1 = set(input().split())
    s2 = set(input().split())
    print(len(s1.intersection(s2)), N - len(s1.union(s2)))

Sqarime

Duke përdorur strukturën set të python-it dhe veprimet e saj (intersection(), union()) zgjidhja bëhet shumë e thjeshtë.

Bëni këto prova:

$ python3
>>> s1 = {2, 3, 4, 5}
>>> s1
{2, 3, 4, 5}
>>> s2 = {4, 5, 5, 6, 7}
>>> s2
{4, 5, 6, 7}
>>> s1.intersection(s2)
{4, 5}
>>> s1.union(s2)
{2, 3, 4, 5, 6, 7}
>>> 

Detyra

Në një lojë kemi N monedha të numëruara nga 1N, dhe fillimisht të gjitha monedhat janë nga e njëjta anë (H ose T). Loja luhet me N raunde, dhe në çdo raund k, lojtari kthen k monedhat e para (nga 1 deri në k) në anën tjetër. Duam të gjejmë se sa monedha do jenë në një anë të caktuar (H ose T) në fund të lojës.

Referenca: https://www.codechef.com/problems/CONFLIP

Shembull

$ cat input.txt
2
1 5 1
1 5 2

$ python3 prog.py < input.txt
2
3

Kemi 2 raste testimi. Në rastin e parë kemi I=1, N=5, Q=1, që do të thotë se fillimisht monedhat janë të gjitha në anën H, kemi 5 monedha dhe 5 raunde, dhe në fund të raundit të 5-të duam të dimë se sa monedha janë në anën H.

Në rastin e dytë është e njëjta gjë, vetëm se duam të dimë se sa monedha janë në anën T (Q=2).

Gjendja e monedhave pas çdo raundi do jetë e tillë: 1. T H H H H 2. H T H H H 3. T H T H H 4. H T H T H 5. T H T H T

Kështu që përgjigja për rastin e parë është 2, kurse për rastin e dytë është 3.