Ois biglietti 20/100

Salve a tutti dopo svariati tentativi nel quale ho provato a risolvere OIS Biglietti non ottengo un punteggio superiore a 20 su 100 nonostante sembra funzionare molto bene.
Il codice è il seguente:

#include <stdio.h>
#include <assert.h>


int compra( int N,  int M,  int A, int B) {
	int i; 
	for ( i= 1; i * M < N; i++) {
		if (A * N < B * i) {
			if ((A * N > B * i + A * i) && (M * i + i >= N))return B * i + A * i;
			break;
		}
		else if ((i * B > B * i + A * i) && (M * i + i >= N))return B * i + A * i;
		else if (B * i && M * i >= N)return B * i;
	}
	return (A * N > i * B) ? i * B : A * N;
}

int main() {
    FILE *fr, *fw;
    int N, M, A, B;

    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");

    assert(4 == fscanf(fr, "%d%d%d%d", &N, &M, &A, &B));

    fprintf(fw, "%d\n", compra(N, M, A, B));
    fclose(fr);
    fclose(fw);
    return 0;
}

piu precisamente l’errore che mi da è al
Subtask1 001= l’output non è coretto
Subtask2 014= l’output non è corretto
Subtask4 021=l’output non è corretto

Sembra esserci un errore per un determinato input ma non riesco a trovare quale

Ciao, potresti illustrare qual è il concetto alla base del tuo codice, in modo da poter comprendere meglio cosa fa il tuo programma? Inoltre, mi sembra che con questo input dia un risultato sbagliato.

Input: 11 10 150 1380
Output corretto: 1530
Output del tuo codice: 1650

Posso comunque darti qulache suggerimento “alla ceca”:

  • Evita di usare un ciclo for, ti complichi la vita!
  • Usa una serie di if, con casi tipo…
    • A \times M < B? Ti conviene comprare un carnet se M corse singole costano di meno?

    • Se conviene comprare carnet, cosa fai quando il numero di biglietti che devi comprare è minore di M?

Se può servire ti posso mandare un’implementazione di esempio. Buona serata!

grazie della risposta comunque alla fine ho risolto il problema

1 Mi Piace