http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_B&lang=ja
** 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.
#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;
}
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