Biglietti a Milano 10/100

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

using namespace std;

int compra(int N, int M, int A, int B){

    if(M >= N){
        if(A * N > B)
            return B;
        else
            return A * N;
    }

    if(M < N){

        int diff = (N / M) + 1;
        int tot = 0;

        if(A * N > B * diff)
            return B * diff;
        else {
            if(((B * diff) - (A * N)) < B){
                int i;
                for(i = 1; i != (B * diff)/B; i++){
                    tot += B;
                }
                i -= 1;
                return tot + A * (N - (M * i));
            }
            else
                return A * N;
        }
        return 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;

}

Ci sono 4 subtask errate ma non ne capisco il motivo, avete consigli?

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

int compra(int N, int M, int A, int B) {

    //variabili
    int diff = N / M + 1, tot = 0, m = 0, b = 0;

    //primo caso
    if(M >= N) {
        if(A * N < B)
            return A * N;
        else
            return B;
    }

    //secondo caso
    else {
        
        while(m < N){
            b = N - m;
            
            if(A * b < B) {
                tot += A * b;
                m += b;
            }
            else {
                tot += B;
                m += M;
            }
        }
        
        if(B * diff < tot)
            return B * diff;
        
        if(A * N < tot)
            return A * N;
        
        return tot;
    }
}

int main(){

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int N, M, A, B;
    cin >> N >> M >> A >> B;
    cout << compra(N, M, A, B);
}