Problemi 057

Kërkesa

Në spektaklin “Kujt ia mban të jetë milioner?” (“Who dares to be a millionaire?”) bëhen N pyetje, ku çdo pyetje ka 26 alternativa që shënohen me shkronjat A-Z, nga të cilat vetëm njëra është e saktë. Pjesëmarrësit i dinë pyetjet që do bëhen dhe e kanë ndarë mendjen për përgjigjet që do japin, por pa e ditur nëse këto përgjigje janë të sakta.

Loja bëhet kështu. Në fillim pyetjet përzihen në mënyrë që radha e tyre të jetë e rastësishme. Pastaj pyetjet i drejtohen një nga një pjesëmarrësit. Nëse përgjigja është e saktë, vazhdohet me pyetjen tjetër, përndryshe loja mbaron.

Lojtari shpërblehet në këtë mënyrë. Nëse s’ka dhënë asnjë përgjigje të saktë merr shpërblimin \(W_0\), nëse ka dhënë 1 përgjigje të saktë shpërblimi është \(W_1\), për 2 përgjigje të sakta shpërblimi është \(W_2\), e kështu me radhë. Vetëm se nuk është e thënë që \(W_{i+1} > W_i\) (mesa duket kjo lojë do jetë shpikur nga ndonjë i lojtur).

Nqs dimë përgjigjet e sakta për çdo pyetje, përgjigjet e një lojtari, dhe vlerat e shpërblimeve, sa është shpërblimi më i madh që mund të fitojë ky lojtar?

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

Shembull

$ cat input.txt
3
5
ABCDE
EBCDA
0 10 20 30 40 50
4
CHEF
QUIZ
4 3 2 1 0
8
ABBABAAB
ABABABAB
100 100 100 100 100 100 100 100 100

$ python3 prog.py < input.txt
30
4
100

Në rastin e parë, nëse pyetjet renditen sipas radhës (2, 3, 4, 5, 1), atere lojtari do japë 3 përgjigje të sakta dhe do fitojë 30 pikë.

Në rastin e dytë, sido që të renditen pyetjet lojtari nuk ka asnjë përgjigje të saktë, kështu që do fitojë \(W_0\).

Në rastin e tretë, sado përgjigje të sakta të japë, nuk ka për të fituar veçse 100 pikë.

Zgjidhja 1

T = int(input())
for _ in range(T):
    n = int(input())
    Q = input()
    A = input()
    W = list(map(int, input().split()))
    c = 0
    for i in range(n):
        if Q[i] == A[i]:
            c += 1
    if c == n:
        print(W[n])
    else:
        wmax = W[0]
        for i in range(c+1):
            if W[i] > wmax:
                wmax = W[i]
        print(wmax)

Sqarime

Fillimisht gjejmë se sa është numri i përgjigjeve të sakta (c – correct). Nëse të gjitha përgjigjet janë të sakta, atere shpërblimi i vetëm i mundshëm është \(W[n]\), përndryshe të gjitha shpërblimet janë të mundshme, nga \(W_0\) te \(W_c\). Dhe meqenëse \(W\) nuk është e thënë të jetë e renditur në rendin rritës, duhet të gjejmë se cila është vlera më e madhe nga këto.

Zgjidhja 2

for _ in range(int(input())):
    n = int(input())
    Q = input()
    A = input()
    W = [int(w) for w in input().split()]
    c = 0
    for i in range(n):
        if Q[i] == A[i]:
            c += 1
    print(W[n]) if c==n else print(max(W[0:c+1]))

Sqarime

Është e njëjta zgjidhje por pak më ndryshe. W[0:c+1] është një nënlistë e listës W, me elementet nga 0 deri në c. Kurse funksioni max() gjen vlerën më të madhe të një liste.

Detyra

Bëni një program që kontrollon nëse një varg numrash plotëson këto kushte:

  • Ka një qendër (dmth numri i elementeve në të majtë të qendrës është i barabartë me numrin e elementeve në të djathtë).
  • Numri i parë dhe i fundit është 1.
  • Duke u nisur nga qendra, numrat në të majtë dhe në të djathtë vijnë duke zbritur me nga 1.

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

Shembull

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

$ python3 prog.py < input.txt
yes
no
no
no
yes
no
no