Buon giorno a tutti, sto provando a risolvere il problema treni e ho scritto un codice che però risolve solo i subtask 1,2 e 3.
questo per prima cosa controlla se è ottimale optare per prendere il treno il primo giorno, e se sì, quale, poi controlla tutti i giorni fino al penultimo, facendo attenzione se sia conveniente o no prendere il treno affatto, all’ultimo giorno controlla la scelta che si era fatta il giorno prima (l’ha preso o non l’ha preso) e agisce di conseguenza, questo va bene fino al subtask 4, da lì in poi da sempre output sbagliato, se potete aiutarmi ne sarei molto felice, grazie.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int tempo_massimo(int N, int a[], int b[]){
if (N == 1){
if(a[0] > b[0]){
return a[0];
}else{
return b[0];
}
}
int tmax = 0, suma = 0, sumb = 0;
bool prevsum = true;
suma = a[1]+a[0];
sumb = b[0]+a[1];
if (suma > b[1] || sumb > b[1]){
if(a[0] > b[0]){
tmax = a[0];
}else{
tmax = b[0];
}
prevsum = false;
}
for(int i = 1; i < N-1; i++){
if(prevsum){
sumb = b[i]+a[i+1];
if(sumb > b[i+1]){
tmax += b[i];
prevsum = false;
continue;
}else{
prevsum = true;
continue;
}
}
suma = a[i+1]+a[i];
if (suma>b[i+1]){
tmax += a[i];
prevsum = false;
}else{
prevsum = true;
}
}
if(prevsum){
tmax += b[N-1];
}else{
tmax += a[N-1];
}
return tmax;
}
int main()
{
int n;
FILE *in = stdin, *out = stdout;
assert(fscanf(in, "%d", &n) == 1);
int *a = (int*)calloc(n, sizeof(int));
int *b = (int*)calloc(n, sizeof(int));
for(int i=0; i<n; i++){
assert(fscanf(in, "%d", a + i) == 1);
assert(fscanf(in, "%d", b + i) == 1);
}
int answ = tempo_massimo(n, a, b);
fprintf(out, "%d\n", answ);
free(a);
free(b);
fclose(in);
fclose(out);
return EXIT_SUCCESS;
}