Ψάχνοντας τους ανταγωνιστές
Η πόλη στην οποία μένει ο Τάκης αποτελείται από σπίτια, χτισμένα κατά μήκος μιας ευθείας γραμμής και αριθμημένα από το έως και το , από τα αριστερά προς τα δεξιά. Δύο διαδοχικά σπίτια απέχουν μεταξύ τους μονάδα απόστασης.
Στην ίδια πόλη, στα σπίτια και , όπου , μένουν δύο ανταγωνιστές του Τάκη. Τις τοποθεσίες των και δεν τις γνωρίζει ο Τάκης, τις γνωρίζει όμως ο φίλος του ο Γιάννης.
Ο Γιάννης δεν θέλει ο φίλος του να μπλέκεται σε καυγάδες, αλλά έχει βαρεθεί την υπερβολική ησυχία της πόλης του. Για αυτό θέλει να μαρτυρήσει στον Τάκη τις κρυφές τοποθεσίες με... έμμεσο τρόπο. Ο Τάκης μπορεί να υποδείξει στον Γιάννη ένα σπίτι και αυτός θα του απαντήσει με το άθροισμα των αποστάσεων του από τα σπίτια και , δηλαδή το . Ο Τάκης δεν έχει χρόνο για χάσιμο. Θέλει να βρει τα σπίτια των ανταγωνιστών του κάνοντας προς τον Γιάννη το πολύ ερωτήματα αυτού του είδους.
Πριν ο Τάκης αρχίσει να ρωτάει, ο Γιάννης του ανακοινώνει τον αριθμό των σπιτιών, δηλαδή το . Επίσης, ανάλογα με τα κέφια του, ο Γιάννης μπορεί να του αποκαλύψει και την απόσταση μεταξύ των σπιτιών και (που προφανώς ισούται με ), μπορεί όμως και να μη θέλει να του την αποκαλύψει.
Περιέργως, ο Τάκης κατάφερε να λύσει το πρόβλημα. Τώρα είναι η σειρά σας! Μπείτε στην θέση του και βρείτε τα σπίτια και , χωρίς να ξεπεράσετε το όριο των ερωτημάτων ανά στιγμιότυπο.
Πρόβλημα
Το πρόβλημα αυτό είναι διαδραστικό (interactive). Αν δεν έχετε ξανασυναντήσει τέτοιου είδους πρόβλημα, συμβουλευτείτε τον οδηγό στην ιστοσελίδα του ΠΔΠ (http://www.pdp.gr/). Από την ίδια ιστοσελίδα μπορείτε επίσης να κατεβάσετε το συμπιεσμένο αρχείο grader.zip που περιέχει ένα πρότυπο πρόγραμμα για να σας βοηθήσει να καταλάβετε το πώς λειτουργεί η αλληλεπίδραση, καθώς και έναν υποδειγματικό βαθμολογητή, μαζί με εντολές για να κάνετε compile και να τρέξετε τον κώδικά σας στον δικό σας υπολογιστή.
Αλληλεπίδραση:
Γράψτε ένα πρόγραμμα με το οποίο ο Τάκης θα αλληλεπιδρά με τον Γιάννη και θα προσπαθεί να λύσει ένα ή περισσότερα στιγμιότυπα του παραπάνω προβλήματος, ανεξάρτητα μεταξύ τους, με ενδεχομένως διαφορετικά , , , αλλά με το ίδιο . Ο Γιάννης είτε θα αποκαλύπτει την απόσταση των δύο σπιτιών σε όλα τα στιγμιότυπα του προβλήματος, είτε δε θα την αποκαλύπτει σε κανένα.
Είναι απαραίτητο να συμπεριλάβετε στον κώδικα σας τη γραμμή:
- #include "findinglib.h" (σε C++ ή C)
- uses findinglib; (σε Pascal)
- findinglib grader = new findinglib(); (σε Java)
Με αυτόν τον τρόπο αποκτάτε πρόσβαση στις παρακάτω συναρτήσεις, μέσω των οποίων μπορείτε να αλληλεπιδράσετε με τον Γιάννη:
- int getSubtask();
- int getN();
- int getD();
- int query(int X);
- bool answer(int A, int B);
Οι συναρτήσεις αυτές λειτουργούν ως εξής:
- H συνάρτηση επιστρέφει τον αριθμό του υποπροβλήματος (βλ. παρακάτω), ο οποίος θα είναι ίδιος για όλα τα στιγμιότυπα μιας περίπτωσης ελέγχου.
- Η συνάρτηση επιστρέφει το πλήθος των σπιτιών, .
- Η συνάρτηση επιστρέφει την απόσταση των σπιτιών και , αν ο Γιάννης θέλει να την αποκαλύψει, διαφορετικά .
- Η συνάρτηση επιστρέφει την απάντηση που δίνει ο Γιάννης όταν ο Τάκης του υποδεικνύει το σπίτι , δηλαδή το άθροισμα των αποστάσεων των , από το σπίτι . Προφανώς, πρέπει να είναι .
- Η συνάρτηση πρέπει να καλείται στο τέλος κάθε στιγμιοτύπου του προβλήματος, όταν ο Τάκης έχει εντοπίσει τα κρυφά σπίτια , . Πρέπει να είναι . Η συνάρτηση επιστρέφει αν θα υπάρξει και επόμενο ανεξάρτητο στιγμιότυπο του προβλήματος (με διαφορετικά , , ), ή αν το πρόγραμμά σας πρέπει να σταματήσει την εκτέλεσή του.
Για το συγκεκριμένο πρόβλημα δεν χρησιμοποιούνται αρχεία εισόδου και εξόδου. Η επικοινωνία του προγράμματος σας με τον grader γίνεται μόνο μέσω των παραπάνω συναρτήσεων.
Παράδειγμα αλληλεπίδρασης:
Το πρόγραμμά σας καλεί |
Η συνάρτηση επιστρέφει |
Περιγραφή |
Υπάρχουν σπίτια, αριθμημένα από έως . | ||
Ας υποθέσουμε ότι τα κρυφά σπίτια βρίσκονται στις θέσεις και (φυσικά αυτό δεν το γνωρίζει ακόμα το πρόγραμμά σας). Η απόσταση των κρυφών σπιτιών είναι και ο Γιάννης αποφασίζει να την αποκαλύψει. | ||
Η συνολική απόσταση των δύο σπιτιών από τη θέση είναι . | ||
Η συνολική απόσταση των δύο σπιτιών από τη θέση είναι . | ||
Ο Τάκης μαντεύει σωστά πού βρίσκονται τα δύο σπίτια. Θα ακολουθήσει κι άλλο στιγμιότυπο. | ||
Στο νέο στιγμιότυπο, υπάρχουν σπίτια. | ||
Ας υποθέσουμε ότι τα κρυφά σπίτια βρίσκονται αυτή τη φορά στις θέσεις και . Η απόσταση των κρυφών σπιτιών είναι και ο Γιάννης πάλι την αποκαλύπτει. | ||
Η συνολική απόσταση των δύο σπιτιών από τη θέση είναι . | ||
Η συνολική απόσταση των δύο σπιτιών από τη θέση είναι . | ||
Ο Τάκης πάλι μαντεύει σωστά πού βρίσκονται τα δύο σπίτια. Δεν θα ακολουθήσει άλλο στιγμιότυπο. |
Περιορισμοί
- Το άθροισμα των σε όλα τα στιγμιότυπα μίας περίπτωσης ελέγχου δεν θα ξεπερνά το .
- Αν παραβιάσετε το πρωτόκολλο επικοινωνίας, το πρόγραμμά σας θα τερματιστεί και θα θεωρηθεί ότι απέτυχε η περίπτωση ελέγχου. Ενδεικτικά και χάριν παραδείγματος, τα παρακάτω θεωρούνται παραβιάσεις του πρωτοκόλλου επικοινωνίας:
- Κλήση της ή της με παραμέτρους εκτός των ορίων που αναφέρονται.
- Κλήση της περισσότερες από φορές σε κάποιο στιγμιότυπο.
- Κλήση της με λάθος τιμές των και .
- Κλήση οποιασδήποτε συνάρτησης αφότου η επιστρέψει .
- Χρήση οποιασδήποτε εντολής εισόδου/εξόδου.
Υποπροβλήματα:
Στα τρία πρώτα υποπροβλήματα, ο Γιάννης θα αποκαλύπτει την απόσταση των σπιτιών και .
- (4 βαθμοί) ,
- (6 βαθμοί)
- (20 βαθμοί)
Στα υπόλοιπα υποπροβλήματα, ο Γιάννης δε θα αποκαλύπτει την απόστασή τους.
- (6 βαθμοί)
- (9 βαθμοί)
- (12 βαθμοί)
- (17 βαθμοί)
- (26 βαθμοί)
Παρατηρήσεις:
- Μέγιστος χρόνος εκτέλεσης: sec.
- Μέγιστη διαθέσιμη μνήμη: MB.
Comments