Εισιτήρια για το καρναβάλι (tickets)
Ο Ringo είναι σε ένα καρναβαλι στην Σιγκαπούρη. Έχει στην τσάντα του μερικά εισιτήρια επιβράβευσης (κουπόνια), που θέλει να χρησιμοποιήσει. Κάθε εισιτήριο έχει ένα από χρώματα και τυπωμένο πάνω του ένα μη αρνητικό ακέραιο. Οι ακέραιοι σε διαφορετικά εισιτήρια μπορεί να είναι
ίδιοι. Για κάποιο λόγο, είναι σίγουρο ότι το
είναι άρτιος αριθμός.
Ο Ringo έχει στην τσάντα του εισιτήρια από κάθε χρώμα, δηλαδή έχει συνολικά
εισιτήρια. Το
-οστό εισιτήριο χρώματος
έχει τυπωμένο έναν ακέραιο
(
και
).
Το παιχνίδι επιβράβευσης παίζεται σε γύρους, αριθμημένους από
έως
. Κάθε γύρος παίζεται με την ακόλουθη σειρά:
- Ο Ringo διαλέγει από την τσάντα του ένα σύνολο από
εισιτήρια, ένα από κάθε χρώμα. Στη συνέχεια δίνει το σύνολο στον διαχειριστή του παιχνιδιού.
- Ο διαχειριστής του παιχνιδιού σημειώνει τους ακέραιους
που είναι τυπωμένοι στα εισιτήρια του συνόλου. Η σειρά αυτών των
ακεραίων δεν είναι σημαντική.
- Ο διαχειριστής του παιχνιδιού τραβάει στην τύχη μια ειδική κάρτα από ένα τυχερό κουτί και σημειώνει τον ακέραιο
που είναι τυπωμένος σε αυτήν την κάρτα.
- Ο διαχειριστής του παιχνιδιού υπολογίζει τις απόλυτες διαφορές μεταξύ
και
για κάθε
από
έως
. Έστω
το άθροισμα όλων αυτών των απόλυτων διαφορών.
- Για τον γύρο αυτό, ο διαχειριστής του παιχνιδιού δίνει στον Ringo ένα βραβείο αξίας
.
- Τα εισιτήρια του συνόλου ακυρώνονται και δεν μπορούν να χρησιμοποιηθούν σε μελλοντικούς γύρους.
Τα υπόλοιπα εισιτήρια στην τσάντα του Ringo ακυρώνονται μετά από γύρους.
Παρατηρώντας προσεκτικά, ο Ringo αντιλαμβάνεται ότι το βραβείο του παιγνιδιού είναι στημένο! Στην πραγματικότητα υπάρχει ένας εκτυπωτής στο τυχερό κουτί. Σε κάθε γύρο, ο διαχειριστής του
παιχνιδιού βρίσκει έναν ακέραιο που ελαχιστοποiεί την τιμή του βραβείου αυτού του γύρου. Η τιμή που επιλέγεται από τον διαχειριστή του παιχνιδιού τυπώνεται στη ειδική κάρτα αυτού του γύρου.
Έχοντας όλη αυτή την πληροφόρηση, ο Ringo θέλει να βρει πώς θα μοιράσει τα εισιτήρια στους γύρους του παιγνιδιού. Δηλαδή, θέλει να επιλέξει το σύνολο των εισιτηρίων που θα χρησιμοποιήσει σε κάθε γύρο για να μεγιστοποιήσει το συνολικό ποσό των βραβείων.
Λεπτομέρειες υλοποίησης
Θα πρέπει να υλοποιήσετε την παρακάτω συνάρτηση:
int64 find_maximum(int k, int[][] x)
: το πληθος των γύρων.
: ένας πίνακας διαστάσεων
x
με τους ακέραιους κάθε εισιτηρίου. Τα εισιτήρια κάθε χρώματος είναι ταξινομημένα σε μη-φθίνουσα σειρά των ακεραίων τους.
- Αυτή η συνάρτηση καλείται ακριβώς μια φορά.
- Η συνάρτηση αυτή θα πρέπει να καλέσει ακριβώς μια φορά την allocate_tickets (βλ. παρακάτω), περιγράφοντας
σύνολα εισιτήρων, ένα για κάθε γύρο. Η κατανομή θα πρέπει να μεγιστοποιεί την συνολική τιμή των βραβείων.
- Αυτή η συνάρτηση θα πρέπει να επιστρέφει την συνολική αξία των βραβείων.
Η συνάρτηση allocate_tickets ορίζεται ως εξής:
void allocate_tickets(int[][] s)
: ένας πίνακας διαστάσεων
x
. Η τιμή του
θα πρέπει να είναι
αν το εισιτήριο
χρώματος
χρησιμοποιείται στο σύνολο του γύρου
του παιχνιδιού, ή
αν δεν χρησιμοποιείται καθόλου.
- Για κάθε
, μεταξύ των
,
κάθε τιμή
πρέπει να εμφανίζεται μια φορά, και όλες οι άλλες τιμές να είναι
.
- Αν υπάρχουν πολλές διατάξεις που δίνουν την μέγιστη συνολική τιμή βραβείου, μπορείτε να αναφέρετε οποιαδήποτε από αυτές.
Παραδείγματα
Παράδειγμα 1
Έστω η παρακάτω κλήση:
find_maximum(2, [[0, 2, 5],[1, 1, 3]])
Αυτό σημαίνει ότι:
- υπάρχουν
γύροι
- οι ακέραιοι που είναι τυπωμένοι στα εισιτήρια χρώματος
είναι
,
και
, αντίστοιχα
- οι ακέραιοι που είναι τυπωμένοι στα εισιτήρια χρώματος
είναι
,
και
, αντίστοιχα.
Μια πιθανή διάταξη που δίνει την μέγιστη συνολική τιμή βραβείου είναι:
- Στο γύρο
, ο Ringo επιλέγει το εισιτήριο
χρώματος
(με το ακέραιο
) και το εισιτήριο
χρώματος
(με τον ακέραιο
). Η χαμηλότερη δυνατή τιμη βραβείου στον γύρο αυτό είναι
. Δηλαδή, ο διαχειριστής του παιγνιδιού μπορεί να επιλέξει
: |
| + |
| =
=
.
- Στον γύρο
, ο Ringo επιλέγει το εισιτήριο
χρώματος
(με τον ακέραιο
) και το εισιτήριο
χρώματος
(με τον ακέραιο
). Η χαμηλότερη πιθανή τιμή βραβείου σε αυτό τον γύρο είναι
. Δηλαδή, ο διαχειριστής του παιγνιδιού μπορεί να επιλέξει
: |
| + |
| =
=
.
- Επομένως, η συνολική τιμή των βραβείων θα πρέπει να είναι
.
Για να βγει αυτό το αποτέλεσμα, θα πρέπει η διαδικασία find_maximum να εκτελέσει την ακόλουθη κλήση στην allocate_tickets:
- allocate_tickets([[0, -1, 1], [-1, 1, 0]])
- Τέλος, η διαδικασία find_maximum θα πρέπει να επιστρέψει
7
.
Παράδειγμα 2
Έστω η ακόλουθη κλήση:
find_maximum(1, [[5, 9], [1, 4], [3, 6], [2, 7]])
Αυτό σημαίνει ότι:
- υπάρχει μόνο ένας γύρος,
- οι ακέραιοι που είναι τυπωμένοι στα εισιτήρια χρώματος
είναι
και
, αντίστοιχα
- οι ακέραιοι που είναι τυπωμένοι στα εισιτήρια χρώματος
είναι
και
, αντίστοιχα
- οι ακέραιοι που είναι τυπωμένοι στα εισιτήρια χρώματος
είναι
και
, αντίστοιχα
- οι ακέραιοι που είναι τυπωμένοι στα εισιτήρια χρώματος
είναι
και
, αντίστοιχα.
Μια πιθανή διάταξη που δίνει την μέγιστη συνολική τιμή βραβείου είναι:
- Στο γύρο
, ο Ringo επιλέγει το εισιτήριο
χρώματος
(με τον ακέραιο
), το εισιτήριο
χρώματος
(με τον ακέραιο
), το εισιτήριο
χρώματος
(με τον ακέραιο
), το εισιτήριο
χρώματος
(με τον ακέραιο
). Η χαμηλότερη πιθανή τιμή βραβείου σε αυτό τον γύρο είναι
, όταν ο διαχειριστής του παιγνιδιού επιλέξει
: |
| + |
| + |
| + |
| =
=
.
Για να αναφερθεί αυτή η λύση θα πρέπει η συνάρτηση find_maximum να εκτελέσει την παρακάτω κλήση της allocate_tickets:
- allocate_tickets([[-1, 0], [0, -1], [0, -1], [-1, 0]])
Τέλος, η συνάρτηση find_maximum θα πρέπει να επιστρέψει 12
.
Περιορισμοί
και
είναι άρτιος.
(για κάθε
και
(για κάθε
και
)
Υποπροβλήματα
- (
βαθμοί)
- (
βαθμοί)
- (
βαθμοί)
(για κάθε
και
)
- (
βαθμοί)
- (
βαθμοί)
- (
βαθμοί)
- (
βαθμοί) Χωρίς επιπλέον περιορισμούς.
Υποδειγματικός βαθμολογητής
Ο υποδειγματικός βαθμολογητής διαβάζει την είσοδο ως εξής:
- γραμμή
:
- γραμμή
(
):
Ο υποδειγματικός βαθμολογητής τυπώνει την απάντηση ως εξής:
- γραμμή
: η τιμή που επιστρέφει η find_maximum
- γραμμή
(
):
Comments