24ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ



Σχετικά έγγραφα
ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΗΣ ΦΑΣΗΣ Οι παρακάτω λύσεις είναι απολύτως ενδεικτικές

ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ ΕΠΑΓΓΕΛΜΑΤΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΜΕΛΟΣ IFIP, IOI

ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ ΕΠΑΓΓΕΛΜΑΤΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ GREEK COMPUTER SOCIETY

ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΗΣ ΦΑΣΗΣ

ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ ΕΠΑΓΓΕΛΜΑΤΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΜΕΛΟΣ IFIP, IOI Org. GREEK COMPUTER SOCIETY MEMBER OF IFIP, IOI Org.

ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΠΡΟΒΛΗΜΑΤΟΣ Β ΦΑΣΗΣ

Μάθημα 21: Ουρές (Queues)

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

24ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

24ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Φροντιςτήριο. Linked-List

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 2

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Συµβολοσειρές - Strings

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 1

ΘΕΜΑ Α ΦΑΣΗΣ. Υπολογιστικά Νέφη Ενδεικτικές Απαντήσεις

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Εισαγωγή στον Προγραμματισμό

HY150a Φροντιστήριο 3 24/11/2017

Προγραμματισμός Υπολογιστών με C++

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομημένος Προγραμματισμός

Προγραμματισμό για ΗΜΥ

Σημειώσεις όγδοης εβδομάδας

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

Πανεπιστήμιο Πελοποννήσου. Σχολή Θετικών Επιστημών & Τεχνολογίας. Τμήμα Επιστήμης & Τεχνολογίας Υπολογιστών. Προγραμματισμός Ι Εργαστήριο

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.

Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

ιαφάνειες παρουσίασης #6 (β)

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αριθμητικοί αλγόριθμοι

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΠΡΟΤΥΠΑ. ΠΑΡΑ ΕΙΓΜΑ ηµιουργία πρότυπου στοίβας (stack) και στη συνέχεια δηµιουργία µιας στοίβας σηµείων.

Συναρτήσεις (Functions) Εισαγωγή στη C++

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Εισαγωγή στον Προγραμματισμό

Δομημένος Προγραμματισμός (ΤΛ1006)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόμενη Λύση

Εισαγωγή στον Προγραμματισμό

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Προγραμματισμός Ι. Πίνακες, Δείκτες, Αναφορές και Δυναμική Μνήμη. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Εισαγωγή στον Προγραμματισμό

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

Δομές Δεδομένων και Αλγόριθμοι

Συναρτήσεις διαχείρισης αλφαριθμητικών

Αλγόριθμοι Ταξινόμησης Μέρος 1

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ενότητα 5: «Εισαγωγή στον Προγραμματισμό. Απλές ασκήσεις με γλώσσα C»

Εισαγωγή στον Προγραμματισμό

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Η γλώσσα προγραμματισμού C

Δομές Δεδομένων & Αλγόριθμοι

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Δομημένος Προγραμματισμός (ΤΛ1006)

Standard Template Library (STL)

Δισδιάστατοι Πίνακες (2D Arrays) Εισαγωγή στη C++

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

i M-1 1. ij f(i, j) N-1. (pixel) 2. M N (x, y) (x, y ) = 256. R(x, y), G(x, y), B(x, y)

Αναζήτηση χωρίς πληροφόρηση

Εισαγωγή στον δομημένο προγραμματισμό

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

Ανάπτυξη και Σχεδίαση Λογισμικού

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι οι πίνακες; Μονοδιάστατοι πίνακες. Απλές μεταβλητές: Κεντρική μνήμη

Η τιµή εξόδου κάποιας συνάρτησης µπορεί να είναι δείκτης, π.χ.

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ ΤΟΥΣ

Προγραμματισμός Επιπλέον στοιχεία της C++

Μεθόδων Επίλυσης Προβλημάτων

Transcript:

24ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΝΔΕΙΚΤΙΚΕΣ ΑΠΑΝΤΗΣΕΙΣ Γ ΦΑΣΗΣ Θέμα 1 ο : Λουτράκι [30 Μονάδες] C++ Παναγιώτου Σωτήριος 59 ο ΓΕΛ Αθηνών /* USER:pdp24u226 TASK:loutraki LANG:C++ */ #include<bitset> #include<set> #include<map> #include<queue> #include<utility> #include<algorithm> #include<stack> using namespace std; #include"stdio.h" #include"string.h" #include"stdlib.h" #include"assert.h" FILE *fin,*fout; int minx[200001],miny[200001]; int minx_bel[200001],miny_bel[200001]; bool bouno[1000001],paralia[1000001]; int N; int main(){ int i,j,k; fin=fopen("loutraki.in","r"); assert(fin); fscanf(fin,"%d",&n); for(i=1;i<=n;i++){ fscanf(fin,"%d %d",&j,&k); Σελίδα 1 από 10

//printf("check (%d,%d)->(%d, %d)\n",j,k,j+100000,k+100000); j+=100000; k+=100000; //min x for row if(minx_bel[k]==0 minx[k]>j){ minx_bel[k]=i; minx[k]=j; //min y for row if(miny_bel[j]==0 miny[j]>k){ miny_bel[j]=i; miny[j]=k; fclose(fin); for(i=0;i<=200000;i++){ if(minx_bel[i]!=0){ //printf("minx for row %d is %d, belongs to %d\n",i-100000,minx[i]-100000,minx_bel[i]); bouno[minx_bel[i]]=true; for(i=0;i<=200000;i++){ if(miny_bel[i]!=0){ //printf("miny for col %d is %d, belongs to %d\n",i-100000,miny[i]-100000,miny_bel[i]); paralia[miny_bel[i]]=true; j=0; for(i=1;i<=n;i++){ if(bouno[i]&&paralia[i]){ //printf("%d wins\n",i); j++; fout=fopen("loutraki.out","w"); fprintf(fout,"%d\n",j); Σελίδα 2 από 10

fclose(fout); return 0; Σελίδα 3 από 10

Θέμα 2 ο : Παλίνδρομο [30 Μονάδες] C++ Ευάγγελος Κηπουρίδης 11 ο ΓΕΛ Θες/νίκης /* USED : pdp24u11 TASK : minpali LANG : C++ */ #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <utility> #include <vector> #include <list> #include <set> #include <map> #include <stack> #include <queue> using namespace std; #define MAXC 10000005 #define mp make_pair #define INF 0x3f3f3f3f #define X first #define Y second typedef long long llint; typedef pair<int,int> pii; int N, F[MAXC]; char str[maxc], rev[maxc]; void Read() { int i; scanf ("%d %s\n", &N, str); for ( i=0; i<n; ++i ) { rev[i] = str[n-i-1]; void Prefix () { int i, j; F[0] = F[1] = 0; for ( i=2; i<=n; ++i ) { j = F[i-1]; Σελίδα 4 από 10

while ( 1 ) { if ( rev[i-1] == rev[j] ) { F[i] = j+1; else if ( j==0 ) { F[i] = j; else { j = F[j]; void KMP () { int i=0, j=0; while ( 1 ) { if ( i==n ) { if ( str[i] == rev[j] ) { ++i; ++j; else if ( j==0 ) { ++i; else { j = F[j]; printf ("%d\n", 2*N - j ); int main ( void ) { #ifdef D freopen ("input","r",stdin); #endif freopen ("minpali.in","r",stdin); freopen ("minpali.out", "w", stdout ); Read(); Prefix(); KMP(); return 0; Σελίδα 5 από 10

Θέμα 3 ο : Σουβλάκια [40 Μονάδες] C++ Ευάγγελος Κηπουρίδης 11 ο ΓΕΛ Θες/νίκης (90%) /* USED : pdp24u11 TASK : souvlakia LANG : C++ */ #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <utility> #include <vector> #include <list> #include <set> #include <map> #include <queue> using namespace std; #define MAXN 100005 #define mp make_pair #define SAFE 60000000LL #define INF 0x3f3f3f3f #define X first #define Y second typedef long long llint; typedef pair<int,int> pii; struct Node { int d[3]; int id; node[maxn]; int N, M, A, B, C, L, in[maxn], nstack, stack[maxn]; vector<int> e[maxn], dist[maxn]; set< pii > coast; set< pii >::iterator pos, pos2; bool comp ( Node a, Node b ) { if ( a.d[0] < b.d[0] ) { return true; if ( a.d[0] == b.d[0] && a.d[1] < b.d[1] ) { return true; Σελίδα 6 από 10

if ( a.d[0] == b.d[0] && a.d[1] == b.d[1] && a.d[2] < b.d[2] ) { return true; return false; void Read() { int i, a, b, d; scanf ("%d %d", &N, &M); for ( i=1; i<=m; ++i ) { scanf ("%d %d %d", &a, &b, &d); e[a].push_back(b); e[b].push_back(a); dist[a].push_back(d); dist[b].push_back(d); scanf ("%d %d %d %d", &A, &B, &C, &L); for ( i=1; i<=n; ++i ) { node[i].d[0] = node[i].d[1] = node[i].d[2] = INF; node[i].id = i; void Print () { int i, a; for ( i=1; i<=l; ++i ) { scanf ("%d", &a); if ( in[a] ) { printf ("YES\n"); else { printf ("NO\n"); void Dijkstra ( int s, int d ) { int v, i; node[s].d[d] = 0; set< pii > S; S.insert ( mp(0,s) ); while (!S.empty() ) { v = S.begin()->Y; S.erase ( S.begin() ); Σελίδα 7 από 10

for ( i=0; i<e[v].size(); ++i ) { if ( node[ e[v][i] ].d[d] > node[v].d[d] + dist[v][i] ) { if ( node[ e[v][i] ].d[d]!= INF ) { S.erase ( S.find ( mp ( node[ e[v] [i] ].d[d], e[v][i] ) ) ); node[ e[v][i] ].d[d] = node[v].d[d] + dist[v][i]; S.insert ( mp ( node[ e[v][i] ].d[d], e[v][i] ) ); bool Ok ( set< pii >::iterator thesi, int i ) { --thesi; // thesi->x < node[i].d[1] if ( thesi->y < node[i].d[2] ) { return false; return true; void Insert ( int i ) { int new_val; { ) ) ); ) ); pos = coast.lower_bound ( mp ( node[i].d[1], -1 ) ); if ( pos == coast.begin() Ok(pos, i) ) { if ( pos!= coast.end() && pos->x == node[i].d[1] ) new_val = min ( pos->y, node[i].d[2] ); coast.erase ( coast.find ( mp ( pos->x, pos->y else { new_val = node[i].d[2]; coast.insert ( mp ( node[i].d[1], new_val ) ); pos = pos2 = coast.find ( mp ( node[i].d[1], new_val for ( ++pos2, ++pos; pos2!= coast.end(); ++pos2 ) { if (! ( new_val <= pos2->y ) ) { if ( pos!= coast.end() && pos!= pos2 ) { Σελίδα 8 από 10

coast.erase ( pos, pos2 ); void Compute() { int i, j; sort ( node+1, node+n+1, comp ); in[ node[1].id ] = 1; coast.insert ( mp ( node[1].d[1], node[1].d[2] ) ); nstack = 0; for ( i=2; i<=n; ++i ) { if ( node[i].d[0]!= node[i-1].d[0] ) { in[ node[i].id ] = 1; stack[ ++nstack ] = i; for ( ; i<=n; ++i ) { if ( node[i].d[0]!= node[i-1].d[0] ) { for ( j=1; j<=nstack; ++j ) { Insert ( stack[j] ); nstack = 0; pos = coast.lower_bound ( mp ( node[i].d[1], -1 ) ); #ifdef D +pos2 ) { #endif for ( pos2 = coast.begin(); pos2!= coast.end(); + printf ("%d %d\n", pos2->x, pos2->y); printf ("\n"); if ( pos == coast.begin() Ok(pos, i) ) { in[ node[i].id ] = 1; stack[ ++nstack ] = i; void Brute_Compute() { int i, j, no, a; for ( i=1; i<=l; ++i ) { Σελίδα 9 από 10

scanf ("%d", &a); no = 0; for ( j=1; j<=n; ++j ) { if ( node[j].d[0] < node[a].d[0] && node[j].d[1] < node[a].d[1] && node[j].d[2] < node[a].d[2] ) { printf ("NO\n"); no = 1; if ( no==0 ) { printf ("YES\n"); int main ( void ) { #ifdef D freopen ("input","r",stdin); #endif freopen ("souvlakia.in","r",stdin); freopen ("souvlakia.out","w",stdout); Read(); Dijkstra ( A, 0 ); Dijkstra ( B, 1 ); Dijkstra ( C, 2 ); if ( (llint)n*(llint)l <= SAFE ) { Brute_Compute(); else { Compute(); Print(); return 0; Σελίδα 10 από 10