Biglietti a Milano 30/100 aiuto

#include <bits/stdc++.h>
using namespace std;

int compra(int N, int M, int A, int B) {
    int sol;
    if(N<=M){
        if(A*N<B)
            sol=A*N;
        else
            sol=B;
    }else{
        int u=N/M;
        if(M*u<N){
            if(B*u+B<=A*N)
                sol=B*u+B;
            else
                sol=B*u+(A*(N-M));         
        }else{
            sol=B*u;
        }
    }
    sol = min(A*N, sol);
    return sol;
}

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;
 
}

tutto corretto tranne le subtask 014 e 021, tra tutto il forum, tutti gli esempi che davano i “risolutori”, il mio codice li fa correttamente, se avete idee mi salvate la sanità mentale

Scusa ma non riesco a capire queste righe, non è che le potresti spiegare?

ciao!
ho letto il tuo codice, e ho trovato il problema, è in queste righe:

cambiandole in

if(B * u+B<=B * u + (A*(N%M)))
sol=B * u+B;
else
sol=Bu+(A(N%M));

il codice prende 100, sinceramente non mi sono soffermata molto a capire il funzionamento della tua idea, ma tieni presente che il caso in cui la soluzione ottimale è A*N lo controlli alla fine

il caso che invece ti mancava era vedere, una volta che scegli di prendere “u” carnet se gli ultimi biglietti che ti mancano ti conviene prenderli comprando un altro carnet oppure prendendo N%M biglietti pagandoli come bigietti singoli.

3 Mi Piace