ΠΔΠ-38 (2026) - Α' Φάση - 2 (ovens)
View as PDFΟι φούρνοι του Τάκη
Άλλη μία μέρα σκληρής δουλειάς έφτασε στο τέλος της και ήρθε η ώρα η πιτσαρία να κλείσει. Υπάρχει όμως ένα πρόβλημα! Σήμερα ο βοηθός του Τάκη πήρε ρεπό και ο Τάκης δεν ξέρει πώς να κλείνει τους φούρνους του μόνος του.
Συγκεκριμένα, στην πιτσαρία υπάρχουν φούρνοι, αριθμημένοι από
έως
, και αντίστοιχα
διακόπτες.
Ορισμένοι από τους φούρνους είναι αρχικά αναμμένοι, ενώ οι υπόλοιποι είναι αρχικά σβηστοί.
Δηλώνουμε με
την αρχική κατάσταση του
-οστού φούρνου:
αν είναι αναμμένος και
αν είναι σβηστός.
Οι διακόπτες της πιτσαρίας λειτουργούν με έναν ιδιαίτερο τρόπο: αν χρησιμοποιήσουμε τον -οστό διακόπτη αντιστρέφεται η κατάσταση του
-οστού και των επόμενων
φούρνων (όπου το
είναι ο "χαρακτηριστικός αριθμός" του
-οστού διακόπτη), δηλαδή σβήνονται όσοι από αυτούς τους φούρνους είναι αναμμένοι και ανάβουν όσοι είναι σβηστοί.
Ο Τάκης πρέπει να σβήσει όλους τους φούρνους, αλλά επειδή βιάζεται θέλει να το κάνει όσο πιο σύντομα γίνεται. Ποιο είναι το ελάχιστο δυνατό πλήθος από διακόπτες που χρειάζεται να χρησιμοποιήσει για να το πετύχει;
Πρόβλημα
Να γράψετε ένα πρόγραμμα σε μία από τις γλώσσες του ΠΔΠ (PASCAL, C, C++, JAVA) το οποίο θα διαβάζει τα δεδομένα εισόδου από το αρχείο oven.in και θα εκτυπώνει τα αποτελέσματα στο αρχείο oven.out.
Αρχεία εισόδου (ovens.in)
Η πρώτη γραμμή περιέχει έναν ακέραιο αριθμό : το πλήθος των φούρνων και των διακοπτών της πιτσαρίας.
Η δεύτερη γραμμή περιέχει
ακέραιους αριθμούς
,
,
,
: την αρχική κατάσταση των φούρνων, όπου το
συμβολίζει αναμμένο φούρνο και το
συμβολίζει σβηστό φούρνο.
Η τρίτη γραμμή περιέχει
ακέραιους αριθμούς
,
,
,
: τους χαρακτηριστικούς αριθμούς των διακοπτών.
Αρχεία εξόδου (ovens.out)
Πρέπει να περιέχει μία μόνο γραμμή με έναν ακέραιο αριθμό: το ελάχιστο πλήθος από διακόπτες που χρειάζεται να χρησιμοποιήσει ο Τάκης για να σβήσει όλους τους φούρνους του.
Παράδειγμα αρχείων εισόδου - εξόδου:
Είσοδος:
6
1 0 0 1 1 0
3 2 3 1 1 0
Έξοδος:
3
Εξήγηση:
Ο Τάκης μπορεί να σβήσει όλους τους φούρνους χρησιμοποιώντας διακόπτες, ως εξής:
- Χρησιμοποιεί τον
ο διακόπτη, που αντιστρέφει την κατάσταση του
ου και του επόμενου ενός φούρνου. Η κατάσταση των φούρνων γίνεται
.
- Χρησιμοποιεί τον
ο διακόπτη, που αντιστρέφει την κατάσταση του
ου και των επόμενων δύο φούρνων. Η κατάσταση των φούρνων γίνεται
.
- Χρησιμοποιεί τον
ο διακόπτη, που αντιστρέφει την κατάσταση του
ου και των επόμενων τριών φούρνων. Η κατάσταση των φούρνων γίνεται
.. Επιπλέον, μπορεί να αποδειχθεί ότι ο Τάκης δεν μπορεί να σβήσει όλους τους φούρνους χρησιμοποιώντας λιγότερους από
διακόπτες. Επομένως, η απάντηση είναι
.
Περιορισμοί
Υποπροβλήματα:
- (11 βαθμοί)
για κάθε
(όπου
).
- (17 βαθμοί)
για κάθε
(όπου
).
- (21 βαθμοί)
για κάθε
(όπου
).
- (24 βαθμοί)
για κάθε
(όπου
).
- (27 βαθμοί) Δεν υπάρχουν περαιτέρω περιορισμοί.
Παρατηρήσεις:
- Μορφοποίηση: Στην είσοδο αλλά και στην έξοδο, κάθε γραμμή τερματίζει με έναν χαρακτήρα
newline. - Μέγιστος χρόνος εκτέλεσης:
sec.
- Μέγιστη διαθέσιμη μνήμη:
MB.
- Επικεφαλίδες στον πηγαίο κώδικα: Στην αρχή του πηγαίου κώδικά σας, θα πρέπει να χρησιμοποιήσετε τις παρακάτω επικεφαλίδες.
(* USER: username
LANG: PASCAL
TASK: oven *)
για κώδικα σε PASCAL
/* USER: username
LANG: C
TASK: ovens */
για κώδικα σε C
/* USER: username
LANG: C++
TASK: ovens */
για κώδικα σε C++
/* USER: username
LANG: Java
TASK: ovens */
για κώδικα σε Java
Προσοχή: Η απάντηση μπορεί να υπερβαίνει το . Επίσης, φροντίστε να διαβάζετε την είσοδο και να εκτυπώνετε την έξοδο αποδοτικά, ειδικά αν μεταφράζετε σε C++ ή Java.
Comments