Μπουντρούμια (dungeons)
Ο Ροβέρτος σχεδιάζει ένα νέο παιχνιδι στον υπολογιστή. Στο παιχνίδι υπάρχει ένας ήρωας, αντίπαλοι και
μπουντρούμια. Οι αντίπαλοι είναι αριθμημένοι από το
μέχρι το
και τα
μπουντρούμια είναι αριθμημένα από το
μέχρι το
. Ο
-οστός αντίπαλος (
βρίσκεται στο μπουντρούμι
και έχει δύναμη
. Δεν υπάρχει αντίπαλος στο μπουντρούμι
.
Ο ήρωας ξεκινά μπαίνοντας στο μπουντρούμι , έχοντας δύναμη
. Κάθε φορά που ο ήρωας μπαίνει σε ένα μπουντρούμι
(
), έρχεται αντιμέτωπος με τον αντίπαλο
, με αποτέλεσμα ένα από τα πιο κάτω:
- Αν η δύναμη του ήρωα είναι μεγαλύτερη ή ίση από την δύναμη
του αντιπάλου, τότε ο ήρωας κερδίζει. Αυτό θα έχει ως αποτέλεσμα να αυξηθεί η δύναμη του ήρωα κατά
(
). Σε αυτή την περίπτωση ο ήρωας συνεχίζει πηγαίνοντας στο μπουντρούμι
(
).
- Σε διαφορετική περίπτωση, ο ήρωας χάνει. Αυτό θα έχει ως αποτέλεσμα να αυξηθεί η δύναμη του ήρωα κατά
(
). Σε αυτή την περίπτωση ο ήρωας συνεχίζει πηγαίνοντας στο μπουντρούμι
.
Προσέξτε ότι το μπορεί να είναι μικρότερο, ίσο ή μεγαλύτερο από το
. Επίσης, το
μπορεί να είναι μικρότερο, ίσο ή μεγαλύτερο από το
. Ανεξάρτητα από το αποτέλεσμα της μονομαχίας, ο
αντίπαλος παραμένει στο μπουντρούμι
και διατηρεί δύναμη
.
Το παιχνίδι τελειώνει όταν η ήρωας βρεθεί στο μπουντρούμι .
Μπορεί να αποδειχθεί ότι το παιχνίδι τελειώνει μετά από έναν πεπερασμένο αριθμό μονομαχιών, ανεξάρτητα από το αρχικό μπουντρούμι και τη δύναμη του ήρωα.
Ο Ροβέρτος σας ζητάει να ελέγξετε το παιχνίδι του εκτελώντας προσομοιώσεις. Σε κάθε προσομοίωση, ο Ροβέρτος καθορίζει ένα αρχικό μπουντρούμι
και μία αρχική δύναμη
. Στόχος σας είναι να βρείτε, για κάθε προσομοίωση, τη δύναμη του ήρωα όταν τελειώσει το παιχνίδι.
Λεπτομέρειες υλοποίησης
Πρέπει να υλοποιήσετε τις παρακάτω συναρτήσεις:
void init(int n, int[] s, int[] p, int[] w, int[] l)
: το πλήθος των αντιπάλων.
,
,
,
: πίνακες μήκους
. Για
:
είναι η δύναμη του αντιπάλου
. Είναι επίσης η δύναμη που θα κερδίσει ο ήρωας αν νικήσει τον αντίπαλο
.
είναι η δύναμη που θα κερδίσει ο ήρωας αν χάσει από τον αντίπαλο
.
είναι το μπουντρούμι που θα μπει ο ήρωας αν νικήσει τον αντίπαλο
.
είναι το μπουντρούμι που θα μπει ο ήρωας αν χάσει από τον αντίπαλο
.
Αυτή η συνάρτηση καλείται ακριβώς μία φορά, πριν κληθεί η συνάρτηση simulate (βλ. παρακάτω).
int64 simulate(int x, int z)
: το αρχικό μπουντρούμι που μπαίνει ο ήρωας.
: η αρχική δύναμη του ήρωα.
- Αυτή η συνάρτηση πρέπει να επιστρέψει τη δύναμη του ήρωα όταν τελειώσει το παιχνίδι, υποθέτοντας ότι ο ήρωας ξεκινά το παιχνίδι μπαίνοντας στο μπουντρούμι
έχοντας δύναμη
.
- Αυτή η συνάρτηση καλείται ακριβώς
φορές.
Παράδειγμα
Έστω η ακόλουθη κλήση:
init(3, [2, 6, 9], [3, 1, 2], [2, 2, 3], [1, 0, 1])
Το παραπάνω σχήμα απεικονίζει αυτή την κλήση. Κάθε τετράγωνο δείχνει ένα μπουντρούμι. Για τα μπουντρούμια ,
και
, οι τιμές
και
υποδεικνύονται μέσα στα τετράγωνα. Τα κόκκινα βέλη δείχνουν πού πηγαίνει ο ήρωας μετά τη νίκη σε μια μονομαχία, ενώ τα μαύρα βέλη δείχνουν πού πηγαίνει ο ήρωας μετά από ήττα.
Έστω ότι ο βαθμολογητής καλεί την simulate(0, 1).
Το παιχνίδι εξελίσσεται ως εξής:
Μπουντρούμι | Η δύναμη του ήρωα πριν την μονομαχία | Αποτέλεσμα |
0 | 1 | Ήττα |
1 | 4 | Ήττα |
0 | 5 | Νίκη |
2 | 7 | Ήττα |
1 | 9 | Νίκη |
2 | 15 | Νίκη |
3 | 24 | Τέλος παιχνιδιού |
Επομένως, η συνάρτηση θα πρέπει να επιστρέψει 24
.
Έστω ότι ο βαθμολογητής καλεί την simulate(2, 3).
Το παιχνίδι εξελίσσεται ως εξής:
Μπουντρούμι | Η δύναμη του ήρωα πριν την μονομαχία | Αποτέλεσμα |
2 | 3 | Ήττα |
1 | 5 | Ήττα |
0 | 6 | Νίκη |
2 | 8 | Ήττα |
1 | 10 | Νίκη |
2 | 16 | Νίκη |
3 | 25 | Τέλος παιχνιδιού |
Επομένως, η συνάρτηση θα πρέπει να επιστρέψει 25
.
Περιορισμοί
(για κάθε
)
(για κάθε
)
(για κάθε
)
Υποπροβλήματα
- (
βαθμοί)
,
,
,
(για κάθε
- (
βαθμοί)
=
(για κάθε
)
- (
βαθμοί)
, όλοι οι αντίπαλοι έχουν την ίδια δύναμη, δηλαδή
=
για κάθε
.
- (
βαθμοί)
, υπάρχουν το πολύ
διακριτές τιμές μεταξύ όλων των τιμών
.
- (
βαθμοί)
- (
βαθμοί) Χωρίς επιπλέον περιορισμούς.
Υποδειγματικός βαθμολογητής
Ο υποδειγματικός βαθμολογητής διαβάζει την είσοδο ως εξής:
- γραμμή
:
- γραμμή
:
- γραμμή
:
- γραμμή
:
- γραμμή
:
- γραμμή
+
(
):
για την
-οστή κλήση της simulate.
Ο υποδειγματικός βαθμολογητής τυπώνει τις απαντήσεις ως εξής:
- γραμμή
+
(
) : η τιμή που επιστρέφει η
-οστή κλήση της simulate.
Comments