👤
Iustinian57
a fost răspuns

De ce nu merge acest program pe pbinfo la problmea #3734?


#include
#define MAXNRPIL 100
#define MAXNUME 100

char nume[MAXNRPIL][MAXNUME+1];
int timppil[MAXNRPIL];
int main( ) {
FILE *fin, *fout;
int cer, maxture, ture, nrpil, turk, min, sec, t, i, j, mint, maxtk, pil, pilk, cat, rest, u, max, p;
char aux;

fin = fopen( "formula1.in", "r" );
fscanf( fin, "%d%d%d%d%d", &cer, &maxture, &ture, &nrpil, &turk );

maxtk = -1;
mint = 30 * 60 + 1;
cat = maxture / ture;
rest = maxture % ture;
for ( i = 0; i < nrpil; i++ ) {
fgetc( fin );
j = 0;
nume[i][j] = fgetc( fin );
while ( nume[i][j] != '\n' ) {
nume[i][++j] = fgetc( fin );
}

for ( j = 0; j < ture; j++ ) {
fscanf( fin, "%d.%d", &min, &sec );
// Transform in secunde
t = min * 60 + sec;

switch ( cer ) {
case 1:
if ( t < mint ) {
mint = t;
pil = i;
}
break;
case 2:
if ( j + 1 == turk && t > maxtk ) {
maxtk = t;
pilk = i;
}
break;
case 3:
timppil[i] += j < rest ? t * ( cat + 1 ) : t * cat;
break;
}
}
}

fclose( fin );
fout = fopen( "formula1.out", "w" );
switch ( cer ) {
case 1:
i = 0;
while ( nume[pil][i] != '\n' ) {
fputc( nume[pil][i++], fout );
}
break;

case 2:
i = 0;
while ( nume[pilk][i] != '\n' ) {
fputc( nume[pilk][i++], fout );
}
break;

case 3:
// Ordonez timpii pilotilor cu select sort
for ( u = nrpil - 1; u > 0; u-- ) {
max = timppil[0];
p = 0;
for ( i = 1; i <= u; i++ ) {
if ( timppil[i] > max ) {
max = timppil[i];
p = i;
} else if ( timppil[i] == max ) {
// Ordonez lexicografic
j = 0;
while ( nume[i][j] == nume[p][j] && j < MAXNUME + 1 ) {
j++;
}
if ( nume[i][j] > nume[p][j] ) {
max = timppil[i];
p = i;
}
}
}
timppil[p] = timppil[u];
timppil[u] = max;
// Interschimb numele pilotilor
for ( i = 0; i < MAXNUME + 1; i++ ) {
aux = nume[p][i];
nume[p][i] = nume[u][i];
nume[u][i] = aux;
}
}

for ( i = 0; i < nrpil; i++ ) {\
fprintf( fout, "%d. ", i + 1 );
j = 0;
while ( nume[i][j] != '\n' ) {
fputc( nume[i][j++], fout );
}
fputc( '\n', fout );
}
break;
}
fclose( fout );

return 0;
}