21 ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΗΣ ΦΑΣΗΣ Οι παρακάτω λύσεις είναι απολύτως ενδεικτικές Θέμα 1 ο : HydroloGIS C++ Γαϊτανίδης Απόστολος Ιδ. ΓΕΛ Εκπ/τηρίων Μαντουλίδη LANG: C++ TASK: hydrologis #include <stdio.h> #include <algorithm> #include <math.h> #define di 1000000 using namespace std; typedef unsigned long long ll; ll a,b,n,m,vr,fj[30],fg[30]; double f[30],fh[30]; FILE *fin = fopen("hydrologis.in","r"),*fout = fopen("hydrologis.out","w"); int main() f[10] = 3.6288; fg[10] = 3628800; for(ll i = 11;i<=20;i++) f[i] = f[i-1] * i; fg[i] = fg[i-1]*i; fj[i] = (ll)(round(f[i])); fh[i] = (double)fg[i]/(double)1000000; fscanf(fin,"%llu %llu %llu %llu %llu",&n,&m,&vr,&a,&b); double s = (double)(m*(m+1))/(double)(2); double ans = (double)vr + (double)a*fh[n] - (double)b*s; fprintf(fout,"%llu\n",(ll)round(ans)); [25 Μονάδες] PASCAL Καρύδης Θρασύβουλος 3ο ΓΕΛ Κέρκυρας (* LANG: Pascal TASK: hydrologis *) program hydrologis; 1 Από 8
uses SysUtils; var a,b,n,m:integer; V_R:longint; V:longint; input,output:text; function factorial(k:integer):real; begin if ( k=1 ) then factorial := 1 else factorial:= factorial(k-1)*k; end; function sum(k:integer):longint; var i:integer; s:longint; begin s:=0; for i := 1 to k do s:= s + i; sum:=s; end; begin assign(input,'hydrologis.in'); reset(input); readln(input,n); readln(input,m); readln(input,v_r); readln(input,a); readln(input,b); V:= round(v_r + a*factorial(n)/1000000 - b*sum(m)); assign(output,'hydrologis.out'); rewrite(output); writeln(output,v); close(output); end. 2 Από 8
Ουρουελίδης Ευστάθιος 2ο ΓΕΛ Πολίχνης LANG: C TASK: hydrologis #include <stdio.h> #include <math.h> #include <stdlib.h> int main() int i, N, M, V, Vr, a, b, tmp2; double tmp, Va; FILE *fin = fopen("hydrologis.in", "r"); fscanf(fin, "%d %d %d %d %d", &N, &M, &Vr, &a, &b); fclose(fin); tmp = 1; for (i=1;i<=n;i++) tmp = ((tmp*1000000) * i)/1000000; tmp2 = 0; for (i=1;i<=m;i++) tmp2 += i; Va = Vr + (a * (tmp/1000000)) - (b * tmp2); V = (int)(va+0.5); FILE *fout = fopen("hydrologis.out", "w"); fprintf(fout, "%d\n", V); fclose(fout); C 3 Από 8
ΘΕΜΑ 2 ο : Aegean C++ Μπιτζές Γεώργιος 1ο ΓΕΛ Κερατσινίου LANG: C++ TASK: aegean [30 Μονάδες] #include <stdio.h> #include <map> using namespace std; map<int, int> horiz; map<int, int> vert; int D = 0; int horcount = 0; int vertcount = 0; int horizontals[200000]; int verticals[200000]; int N; int process(int x, int y) if(x > D) D = x; if(y > D) D = y; if(horiz[x] == 0) horizontals[++horcount] = x; horiz[x] = y; if(vert[y] == 0) verticals[++vertcount] = y; vert[y] = x; if(horiz[x] > y) horiz[x] = y; if(vert[y] > x) vert[y] = x; int compare(const void *a, const void *b) return *(int*)a - *(int*)b; int readfile(void) FILE *in = fopen("aegean.in", "r"); fscanf(in, "%d", &N); int i, x, y; for(i = 1; i <= N; i++) fscanf(in, "%d %d", &x, &y); process(x, y); 4 Από 8
int output(void) FILE *out = fopen("aegean.out", "w"); fprintf(out, "%d\n", D); fprintf(out, "%d %d\n", horcount, vertcount); qsort(horizontals+1, horcount, sizeof(int), compare); qsort(verticals+1, vertcount, sizeof(int), compare); int i; for(i = 1; i <= horcount; i++) fprintf(out, "%d %d\n", horizontals[i], D+1 - horiz[horizontals[i]]); for(i = 1; i <= vertcount; i++) fprintf(out, "%d %d\n", verticals[i], D+1 - vert[verticals[i]]); fclose(out); int main(void) readfile(); output(); 5 Από 8
ΘΕΜΑ 3ο: CPU C++ Παναγιωτάκος Γεώργιος 1ο ΓΕΛ Σπάρτης USER:gpan1ge LANG:C++ TASK:cpu [45 Μονάδες] #include <iostream> #include <fstream> using namespace std; int n,m; int C[50000][2]; int ins[50000][2],outs[50000][2]; int insn=0,outsn=0; int c[2][100000][2]; int cn[2]=0,0; bool pos( int a1,int a2,int node ) int m1,m2; m1 = min(a1,a2); m2 = max(a1,a2); if( node>m1 && node<m2 ) return true; else return false; int valid(int cn,int a,int b) int i=0,e; for(e=0;e<cn[cn];e++) if( c[cn][e][0] == -1 ) continue; if( pos(c[cn][e][0],c[cn][e][1],a)!= pos(c[cn][e] [0],c[cn][e][1],b) ) return e; return -1;//<--valid int min( int a,int b ) return ((a<b)?a:b); int max( int a,int b) return ((a>b)?a:b); 6 Από 8
bool change( int cn,int ind ) int o1,o2; o1 = valid(1-cn,c[cn][ind][0],c[cn][ind][1]); if( o1 == -1 ) return -2; c[1-cn][cn[1-cn]][0] = c[cn][ind][0]; c[1-cn][cn[1-cn]][1] = c[cn][ind][1]; cn[1-cn]++; c[cn][ind][0] = -1; c[cn][ind][1] = -1; //<-success else return -1;//<--failure int main() ifstream fin( "cpu.in" ); ofstream fout( "cpu.out" ); fin >> n; fin >> m; int u,i0,i1,i2,e,a,b,sol; sol = m; for(u=0;u<m;u++) fin >> a >> b; //cout << a << " " << b << "\n"; C[u][0] = a; C[u][1] = b; i0 = valid(0,a,b); if( i0 == -1 ) c[0][cn[0]][0] = a;c[0][cn[0]][1] = b;cn[0]++; continue; //cout << u << "Not in the first\n"; i1 = valid(1,a,b); if( i1 == -1 ) c[1][cn[1]][0] = a;c[1][cn[1]][1] = b;cn[1]++; continue; //cout << u << "Not in the second\n"; i0 = change( 0, i0 ); if( i0 == -2 ) c[0][cn[0]][0] = a;c[0][cn[0]][1] = b;cn[0]++; continue; i1 = change( 1, i1 ); if( i1 == -2 ) c[1][cn[1]][0] = a;c[1][cn[1]][1] = b;cn[1]++; continue; sol = u; break; fout << sol << "\n"; //cout << sol << "\n"; 7 Από 8
Αρσένης Γεράσιμος 2ο ΓΕΛ Μοσχάτου LANG: C TASK: cpu #include <stdio.h> #define MAX 50005 void swap(int *a, int *b) int tmp; tmp = *a; *a = *b; *b = tmp; return; struct vert int x, y; ; int diff_side(int a, int b, int c, int d) if (d<b && d>a && (c>b c<a)) return 1; if (c<b && c>a && (d>b d<a)) return 1; int main() FILE *fin=fopen("cpu.in", "r"), *fout=fopen("cpu.out", "w"); int n, m, x, y, i, j, type[max], t1, t2; struct vert cpu[max]; fscanf(fin, "%d %d", &n, &m); for (i=1; i<=m; i++) fscanf(fin, "%d %d", &x, &y); if (x>y) swap(&x, &y); cpu[i].x = x; cpu[i].y = y; t1=t2=0; for (j=1; j<i; j++) if (diff_side(x, y, cpu[j].x, cpu[j].y)) if (type[j]==1) t1++; else t2++; //printf("%d\n", cnt); if (t1 && t2) fprintf(fout, "%d\n", i-1); if (t1) type[i] = 2; else type[i] = 1; //printf("diff: %d\n", diff_side(1, 4, 3, 6)); fprintf(fout, "%d\n", m); C 8 Από 8