Code di bawah ini merupakan penyelesaian dari salah satu problem SPOJ yang bernama Printer Queue dalam bahasa C. Accepted 0.00 s.
Problem url: spoj.com/problems/PQUEUE/
#include <stdio.h>
#include <stdlib.h>
typedef struct _data
{ int value;
int ini;
struct _data *back;
} Data;
typedef struct
{ Data *front;
Data *back;
} Queue;
void Init(Queue *q)
{ q->front = NULL;
q->back = NULL;
}
void Enqueue(Queue *q, int val, int iin)
{ Data *tmp = (Data*)malloc(sizeof(Data));
tmp->value = val;
tmp->ini = iin;
tmp->back = NULL;
if(q->back != NULL)
q->back->back = tmp;
q->back = tmp;
if(q->front == NULL)
q->front = tmp;
}
void Dequeue(Queue *q)
{ Data *iter = q->front;
q->front = iter->back;
free(iter);
}
void Shift(Queue *q)
{ Data *iter = q->front;
q->front = iter->back;
q->back->back = iter;
q->back = iter;
q->back->back = NULL;
}
void FreeMem(Queue *q)
{ Data *iter = q->front, *iter2;
while(iter != NULL)
{ iter2 = iter;
iter = iter->back;
free(iter2);
}
}
void Process(Queue *q)
{ if(q->front == q->back)
{ printf("1\n");
return;
}
Data *iter, *iter2;
int st, time = 0;
for(iter = q->front; iter != NULL; iter = q->front)
{ st = 0;
for(iter2 = iter->back; iter2 != NULL; iter2 = iter2->back)
if(iter->value < iter2->value)
{ Shift(q);
st = 1;
break;
}
if(st == 0)
{ time++;
if(iter->ini) break;
Dequeue(q);
}
}
printf("%d\n", time);
FreeMem(q);
}
int main()
{ Queue *q;
int T, n, m, i, tmp;
scanf("%d", &T);
while(T--)
{ scanf("%d %d", &n, &m);
q = (Queue*)malloc(sizeof(Queue));
Init(q);
for(i = 0; i < n; i++)
{ scanf("%d", &tmp);
Enqueue(q, tmp, (i == m));
}
Process(q);
}
}
No comments:
Post a Comment