File d'attente ALDS1_3_B langage C

problème

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_B&lang=ja

Le point

** Queue ** ou ** Queue ** est l'une des ** structures de données ** de base d'un ordinateur. Il contient les données dans une structure de liste premier entré, premier sorti. Lors de la récupération des données de la file d'attente, les données qui ont été insérées en premier sont récupérées dans l'ordre. Mettre des données dans une file d'attente est appelé encu, et le retirer s'appelle décuition.

En d'autres termes, la méthode Tokoten

La planification circulaire [^ 1] peut être simulée à l'aide de files d'attente qui stockent (gèrent) les processus. Tout d'abord, les processus à l'état initial sont mis en file d'attente dans l'ordre. Ensuite, jusqu'à ce que la file d'attente soit vide, répétez le processus consistant à "retirer le processus depuis le début, traiter au maximum Quantum [^ 2], et l'ajouter à nouveau à la file d'attente si le traitement requis (temps) reste". ..

[^ 1]: Round Robin est écrit en anglais comme Round Robin. C'est un mot qui signifie que certains rôles et tours sont échangés dans l'ordre sous certaines conditions. Il est utilisé dans divers endroits tels que la gestion des tâches du système d'exploitation d'un ordinateur personnel d'une manière simple mais également permanente sans utiliser de tête particulière.

[^ 2]: q ms maximum de processus que le CPU peut traiter. La plage qui peut être traitée en une seule fois.

Fonctionnement de la file d'attente

la mise en oeuvre

code

#include <stdio.h>
#include <string.h>
#define LEN 100000

typedef struct
{
    char name[100];
    int time;
} Process;

/* global variable */
static Process Q[LEN];
static int head, tail, n;

/* enqueue */
void enqueue(Process process_obj)
{
    Q[tail] = process_obj;
    tail = (tail + 1) % LEN;
}

/* dequeue */
Process dequeue()
{
    Process process_obj;

    process_obj = Q[head];
    head = (head + 1) % LEN;

    return process_obj;
}

int min(int a, int b) { return a < b ? a : b; }

int main(void)
{
    int elapse_time = 0;
    int time_ms;
    int qms;
    Process process_obj;

    /* input */
    scanf("%d %d", &n, &qms);
    for (int i = 1; i <= n; i++)
    {
        scanf("%s", Q[i].name);
        scanf("%d", &Q[i].time);
    }

    /* initialize */
    head = 1;
    tail = n + 1;

    while (head != tail)
    {
        process_obj = dequeue();
        time_ms = min(qms, process_obj.time);
        process_obj.time -= time_ms;
        elapse_time += time_ms;

        if (process_obj.time > 0)
            enqueue(process_obj);
        else
            printf("%s %d\n", process_obj.name, elapse_time);
    }
    return 0;
}

point

Impressions

Temps requis 180 minutes

【la revue】

    while (head != tail)
    {
        process_obj = dequeue();
        if(process_obj.time > qms){
            process_obj.time -= qms;
            elapse_time += qms;
            enqueue(process_obj);
        } else {
            elapse_time += process_obj.time;
            printf("%s %d\n", process_obj.name, elapse_time);
        }
     }

Recommended Posts

File d'attente ALDS1_3_B langage C
Liste de liens (list_head / queue) en langage C
[Algorithme de langage C] Endianness
[Algorithme de langage C] bloquer le mouvement
Tri de tas fait en langage C
[Langage C] readdir () vs readdir_r ()
Recherche linéaire ALDS1_4_A en langage C
Test de module multi-instance en langage C
Pointeur de fonction et objdump ~ Langage C ~
Réaliser une classe d'interface en langage C
Ecriture du langage C avec Sympy (métaprogrammation)
Langage de programmation C à haute efficacité énergétique
Introduction à Protobuf-c (langage C ⇔ Python)
queue
[Algorithme de langage C] arbre de recherche binaire
Langage C 8 reine résolution de problèmes 3 modèles
Segfo avec 16 caractères en langage C
Appeler le langage C depuis Python (python.h)
4 langage de comparaison de fermeture (Python, JavaScript, Java, C ++)
Communication socket par langage C et Python
Générer un langage C à partir d'une expression S avec Python