// stride.c — planificación por stride, paso a paso.
//
// Uso: ./stride <L> <quanta> <boletos1> <boletos2> ...
// Ejemplo: ./stride 60 6 3 2 1
//
// Cada trabajo tiene stride = L / boletos y un contador pass que empieza en 0.
// En cada quantum corre el trabajo con menor pass (en empate, el de menor
// índice) y su pass aumenta en su stride.
#include <stdio.h>
#include <stdlib.h>

#define MAX_JOBS 8

struct job {
    char name;
    int tickets;
    int stride;
    int pass;
    int runs;
};

int main(int argc, char *argv[]) {
    if (argc < 4 || argc - 3 > MAX_JOBS) {
        fprintf(stderr, "uso: %s <L> <quanta> <boletos>...\n", argv[0]);
        return 1;
    }
    int big = atoi(argv[1]);
    int quanta = atoi(argv[2]);
    int n = argc - 3;

    struct job jobs[MAX_JOBS];
    for (int i = 0; i < n; i++) {
        jobs[i].name = 'A' + i;
        jobs[i].tickets = atoi(argv[3 + i]);
        if (jobs[i].tickets <= 0) {
            fprintf(stderr, "los boletos deben ser positivos\n");
            return 1;
        }
        jobs[i].stride = big / jobs[i].tickets;
        jobs[i].pass = 0;
        jobs[i].runs = 0;
    }

    printf("stride:");
    for (int i = 0; i < n; i++)
        printf("  %c=%d", jobs[i].name, jobs[i].stride);
    printf("\n\npass al inicio de cada quantum:\nq  ");
    for (int i = 0; i < n; i++)
        printf("    %c   ", jobs[i].name);
    printf("corre\n");

    for (int q = 1; q <= quanta; q++) {
        // Elegir el menor pass (búsqueda lineal; una cola de prioridad en la práctica).
        int best = 0;
        for (int i = 1; i < n; i++)
            if (jobs[i].pass < jobs[best].pass)
                best = i;

        printf("%-3d", q);
        for (int i = 0; i < n; i++)
            printf(" %4d   ", jobs[i].pass);
        printf("%c\n", jobs[best].name);

        jobs[best].pass += jobs[best].stride;
        jobs[best].runs++;
    }

    printf("\nveces que corrió:");
    for (int i = 0; i < n; i++)
        printf("  %c=%d", jobs[i].name, jobs[i].runs);
    printf("\n");
    return 0;
}
