-
Notifications
You must be signed in to change notification settings - Fork 0
/
1246_estacionamento.c
111 lines (90 loc) · 3.67 KB
/
1246_estacionamento.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Problema: 1246 - https://www.urionlinejudge.com.br/judge/pt/problems/view/1246
* Autor: Lucas Campos.
*/
#include <stdio.h>
#define SIZE_MAX_PARKING 1000
#define SIZE_CARS 9000
int main() {
// Armazena o tamanho do carro caso esteja no estacionamento. Se "0" então o carro(placa) não está no estacionamento.
int sizeCars[SIZE_CARS];
// Indica a posição inicial do carro(placa) no estacionamento.
int positionCars[SIZE_CARS];
// Contém as posições do tamanho do estacionamento.
int parking[SIZE_MAX_PARKING];
// Variáveis para recuperar o tamanho do estacionamento e o total de entradas e saídas.
int parkingSpace = 0;
int numberEvents = 0;
// Variáveis para recuperar uma entrada ou saída do estacionamento, veiculo e seu tamanho.
char typeEvent;
int placa;
int size;
int index;
int valueTotal;
while (1) {
// Inicializa as estruturas para uma nova instância do problema
for (index = 0; index < SIZE_MAX_PARKING; index++) {
sizeCars[index] = 0;
positionCars[index] = -1;
parking[index] = -1;
}
for (; index < SIZE_CARS; index++) {
sizeCars[index] = 0;
positionCars[index] = -1;
}
valueTotal = 0;
scanf(" %d %d*c", &parkingSpace, &numberEvents);
if (feof(stdin)) {
break;
}
while (numberEvents > 0) {
scanf(" %c*c", &typeEvent);
if (typeEvent == 'C') {
scanf(" %d %d*c", &placa, &size);
// Caso o carro não esteja no estacionamento.
if (positionCars[placa - 1000] == -1) {
// Verificar se existe um lugar no estacionamento
index = 0;
for (; index < parkingSpace; index++) {
// Encotra a primeira posição livre do estacionamento.
while (parking[index] != -1 && index < parkingSpace) {
index++;
}
if (index < parkingSpace) {
int count = 0;
while (parking[index] == -1 && count < size && index < parkingSpace) {
index++;
count++;
}
// Encontrou a primeira vaga que cabe o carro
if (count == size) {
while (count > 0) {
parking[index-count] = placa - 1000;
count--;
}
positionCars[placa - 1000] = index-size;
sizeCars[placa - 1000] = size;
valueTotal += 10;
break;
}
}
}
}
} else {
scanf(" %d*c", &placa);
if (positionCars[placa - 1000] != -1) {
index = positionCars[placa - 1000];
int positionFinal = index + sizeCars[placa - 1000];
for (; index < positionFinal; index++) {
parking[index] = -1;
}
positionCars[placa - 1000] = -1;
sizeCars[placa - 1000] = 0;
}
}
numberEvents--;
}
printf("%d\n", valueTotal);
}
return 0;
}