CSES - Datatähti 2025 alku - Results
Submission details
Task:Kortit I
Sender:DiscoFlower8890
Submission time:2024-11-05 10:41:47 +0200
Language:Python3 (PyPy3)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
Test results
testverdicttimegroup
#10.21 s1, 2, 3details
#20.20 s2, 3details
#30.21 s3details
#40.21 s3details
#50.21 s3details
#60.21 s3details
#70.21 s3details
#80.20 s3details
#90.21 s3details
#100.21 s3details
#110.21 s3details
#120.20 s3details
#130.20 s3details
#140.21 s3details
#150.21 s3details
#160.20 s3details
#170.21 s3details
#180.22 s3details
#190.20 s3details
#200.21 s3details

Code

import cProfile, random

def generate_game(n, a, b):
    if a + b > n:
        raise IndexError("Too many wins compared to rounds.")
    player1_sequence = [0] * n
    player2_sequence = [0] * n

    available_cards = list(range(1, n + 1))
    round_index = 0
    draws = n - a - b
    p1_remaining_cards = available_cards
    p2_remaining_cards = available_cards

    for _ in range(draws):
        # Round which end in a draw
        middle_index_start = (n - draws) // 2
        middle_cards = available_cards[middle_index_start:middle_index_start + draws]
        
        # taking the cards for the draws from the middle of the deck so both players can still win and lose
        p1_remaining_cards = [card for card in available_cards if card not in middle_cards]
        p2_remaining_cards = [card for card in available_cards if card not in middle_cards]
        
        for card in middle_cards:
            player1_sequence[round_index] = card
            player2_sequence[round_index] = card
            round_index += 1

    # Wins for player A
    for _ in range(a):
        for i in range(len(p2_remaining_cards)):
            found = False
            if p1_remaining_cards[-i] > p2_remaining_cards[0]:
                player1_sequence[round_index] = p1_remaining_cards.pop(-i)
                player2_sequence[round_index] = p2_remaining_cards.pop(0)
                round_index += 1
                found = True
                break
        if not found:
            raise IndexError("Couldn't find a card pair")

    # Wins for player B
    for _ in range(b):
        for i in range(len(p1_remaining_cards)):
            found = False
            if p2_remaining_cards[-i] > p1_remaining_cards[0]:
                player2_sequence[round_index] = p2_remaining_cards.pop(-i)
                player1_sequence[round_index] = p1_remaining_cards.pop(0)
                round_index += 1
                found = True
                break
        if not found:
            raise IndexError("Couldn't find a card pair")
    
    # check if we slipped a few zeros in the list
    #TODO Wait shouldn't the wins part pick that up?
    check1 = set(player1_sequence)
    check2 = set(player2_sequence)

    if 0 in check1 or 0 in check2:
        raise IndexError("Left a few 0's game is not possible")

    return player1_sequence, player2_sequence

def main(data):
    #t = int(input())
    for i in range(len(data)):
        #n, a, b = map(int, input().strip().split())
        try:
            #p1_cards, p2_cards = generate_game(3, 3, 0)
            #p1_cards, p2_cards  = generate_game(n, a, b)
            p1_cards, p2_cards  = generate_game(data[i][0], data[i][1], data[i][2])
            print(f"YES\n{p1_cards}\n{p2_cards}")
            print(data[i])
            print()
        except IndexError:
            print("NO")
            print(data[i])
            print()
    return

# Test case generation and profiling
def generate_test_cases_checked(num_tests):
    test_cases = []
    for _ in range(num_tests):
        n = random.randint(1, 101)
        while True:
            a = random.randint(0, n)
            b = random.randint(0, n)
            if a + b <= n:
                test_cases.append((n, a, b))
                break
    return test_cases

# Run with profiling
test_cases = generate_test_cases_checked(1000)
cProfile.run('main(test_cases)')

#if __name__ == "__main__":
#    main(test_cases)

Test details

Test 1

Group: 1, 2, 3

Verdict:

input
54
4 4 0
3 1 3
3 2 2
4 0 4
...

correct output
NO
NO
NO
NO
NO
...

user output
NO
(91, 34, 25)

NO
(78, 25, 46)
...

Test 2

Group: 2, 3

Verdict:

input
284
6 1 0
5 0 2
7 1 5
7 7 5
...

correct output
NO
NO
YES
1 2 3 4 5 6 7 
2 3 4 5 6 1 7 
...

user output
NO
(38, 12, 24)

NO
(79, 6, 62)
...

Test 3

Group: 3

Verdict:

input
955
14 2 10
12 2 5
10 4 9
14 1 13
...

correct output
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(55, 25, 26)

NO
(82, 61, 12)
...

Test 4

Group: 3

Verdict:

input
869
17 12 9
16 8 4
15 9 9
17 11 15
...

correct output
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(91, 28, 27)

NO
(28, 0, 26)
...

Test 5

Group: 3

Verdict:

input
761
18 3 15
19 1 15
18 8 1
19 19 17
...

correct output
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(55, 3, 36)

NO
(13, 0, 13)
...

Test 6

Group: 3

Verdict:

input
925
21 14 21
20 18 18
20 7 6
21 14 9
...

correct output
NO
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(93, 11, 67)

NO
(8, 5, 3)
...

Test 7

Group: 3

Verdict:

input
529
22 3 3
22 17 5
22 6 15
22 22 20
...

correct output
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(48, 27, 20)

NO
(19, 6, 6)
...

Test 8

Group: 3

Verdict:

input
576
23 18 9
23 16 8
23 16 13
23 16 22
...

correct output
NO
NO
NO
NO
NO
...

user output
NO
(54, 31, 15)

NO
(98, 34, 13)
...

Test 9

Group: 3

Verdict:

input
625
24 2 22
24 15 21
24 6 3
24 21 1
...

correct output
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(16, 0, 8)

NO
(80, 9, 12)
...

Test 10

Group: 3

Verdict:

input
676
25 16 25
25 15 2
25 15 7
25 15 16
...

correct output
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(36, 12, 16)

NO
(72, 22, 25)
...

Test 11

Group: 3

Verdict:

input
729
26 2 18
26 14 18
26 5 18
26 19 13
...

correct output
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(22, 6, 6)

NO
(39, 4, 30)
...

Test 12

Group: 3

Verdict:

input
784
27 26 7
27 14 0
27 14 5
27 14 14
...

correct output
NO
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(91, 6, 37)

NO
(8, 0, 1)
...

Test 13

Group: 3

Verdict:

input
841
28 26 16
28 13 19
28 5 8
28 26 4
...

correct output
NO
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(44, 16, 16)

NO
(75, 0, 18)
...

Test 14

Group: 3

Verdict:

input
900
29 24 15
29 13 2
29 13 7
29 13 16
...

correct output
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
YES
[51, 101, 100, 99, 98, 97, 96,...

Test 15

Group: 3

Verdict:

input
961
30 24 26
30 12 24
30 4 29
30 24 14
...

correct output
NO
NO
NO
NO
YES
...

user output
NO
(64, 25, 17)

NO
(36, 8, 5)
...

Test 16

Group: 3

Verdict:

input
1000
15 12 6
33 18 30
44 4 26
6 6 5
...

correct output
NO
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(65, 14, 49)

NO
(35, 16, 7)
...

Test 17

Group: 3

Verdict:

input
1000
45 32 30
4 0 3
46 23 10
71 19 46
...

correct output
NO
NO
YES
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
NO
(66, 48, 13)

NO
(70, 17, 32)
...

Test 18

Group: 3

Verdict:

input
1000
51 29 37
75 11 72
5 2 4
31 8 26
...

correct output
NO
NO
NO
NO
YES
...

user output
NO
(6, 1, 1)

NO
(5, 0, 3)
...

Test 19

Group: 3

Verdict:

input
1000
50 20 37
99 45 58
86 79 73
85 70 54
...

correct output
NO
NO
NO
NO
NO
...

user output
NO
(100, 8, 56)

NO
(11, 1, 2)
...

Test 20

Group: 3

Verdict:

input
1000
26 23 5
73 53 59
64 47 41
80 75 55
...

correct output
NO
NO
NO
NO
NO
...

user output
NO
(15, 7, 6)

NO
(89, 5, 75)
...