Cómo implementar este problema: Problema – C – Fuerzas de código

Creo que la idea clave en este problema es darse cuenta de que después de realizar tareas en la computadora 1, nunca nos movemos directamente a la computadora 3 porque pasar de 1 a 2 (costo 1) y luego de 2 a 3 (costo 1) tiene el mismo costo como pasar de 1 a 3.
Entonces, desde la computadora 1, siempre pasamos a la computadora 2. De 2 a 3, y de 3 a 1.

Por lo tanto, podemos simular el juego comenzando en las computadoras 1, 2 y 3, y generar el mínimo de las tres simulaciones.

Una tarea puede completarse si todas las tareas de las que depende ya se completaron. Esto es lo mismo que el tipo topológico.

Aquí hay una implementación de muestra en C ++ y un par de comentarios.

#include
#include
#include
#include
using namespace std;
const int MAX = 200 + 1;
int move_to[4] = {0, 2, 3, 1};
int computer[MAX], in_degree[MAX], n;
vector precedes[MAX]; // Simulate the game starting at computer 'start_at'.
int Simulate(int start_at) {
vector available[4];
int i, num_done = 0, cost = 0, cur = start_at, num_processed[4] = {0,0,0,0}, degree[MAX];
memcpy(degree, in_degree, sizeof degree);
// Check what tasks do not have any dependencies and add them to the available lists.
for (i = 1; i <= n; i++)
if (degree[i] == 0)
available[computer[i]].push_back(i); for (;;) {
for (; num_processed[cur] < (int)available[cur].size(); num_processed[cur]++) {
int task = available[cur][num_processed[cur]];
cost++;
num_done++;
// Process this task. Decrease the number of depencies of task that require this one.
// If the number of dependencies becomes 0, then the task can be done.
for (auto j : precedes[task]) {
if (--degree[j] == 0)
available[computer[j]].push_back(j);
}
}
if (num_done == n)
return cost;
cost++;
cur = move_to[cur];
}
return -1;
} int main() {
int i, j, k, res;
cin >> n;
for (i = 1; i <= n; i++)
cin >> computer[i];
for (i = 1; i <= n; i++) {
cin >> in_degree[i];
for (k = 0; k < in_degree[i]; k++) {
cin >> j;
precedes[j].push_back(i);
}
}
res = min(Simulate(1), Simulate(2));
res = min(res, Simulate(3));
printf("%d\n", res);
return 0;
}

#include
#include
#include
#include
using namespace std;
const int MAX = 200 + 1;
int move_to[4] = {0, 2, 3, 1};
int computer[MAX], in_degree[MAX], n;
vector precedes[MAX]; // Simulate the game starting at computer 'start_at'.
int Simulate(int start_at) {
vector available[4];
int i, num_done = 0, cost = 0, cur = start_at, num_processed[4] = {0,0,0,0}, degree[MAX];
memcpy(degree, in_degree, sizeof degree);
// Check what tasks do not have any dependencies and add them to the available lists.
for (i = 1; i <= n; i++)
if (degree[i] == 0)
available[computer[i]].push_back(i); for (;;) {
for (; num_processed[cur] < (int)available[cur].size(); num_processed[cur]++) {
int task = available[cur][num_processed[cur]];
cost++;
num_done++;
// Process this task. Decrease the number of depencies of task that require this one.
// If the number of dependencies becomes 0, then the task can be done.
for (auto j : precedes[task]) {
if (--degree[j] == 0)
available[computer[j]].push_back(j);
}
}
if (num_done == n)
return cost;
cost++;
cur = move_to[cur];
}
return -1;
} int main() {
int i, j, k, res;
cin >> n;
for (i = 1; i <= n; i++)
cin >> computer[i];
for (i = 1; i <= n; i++) {
cin >> in_degree[i];
for (k = 0; k < in_degree[i]; k++) {
cin >> j;
precedes[j].push_back(i);
}
}
res = min(Simulate(1), Simulate(2));
res = min(res, Simulate(3));
printf("%d\n", res);
return 0;
}

#include
#include
#include
#include
using namespace std;
const int MAX = 200 + 1;
int move_to[4] = {0, 2, 3, 1};
int computer[MAX], in_degree[MAX], n;
vector precedes[MAX]; // Simulate the game starting at computer 'start_at'.
int Simulate(int start_at) {
vector available[4];
int i, num_done = 0, cost = 0, cur = start_at, num_processed[4] = {0,0,0,0}, degree[MAX];
memcpy(degree, in_degree, sizeof degree);
// Check what tasks do not have any dependencies and add them to the available lists.
for (i = 1; i <= n; i++)
if (degree[i] == 0)
available[computer[i]].push_back(i); for (;;) {
for (; num_processed[cur] < (int)available[cur].size(); num_processed[cur]++) {
int task = available[cur][num_processed[cur]];
cost++;
num_done++;
// Process this task. Decrease the number of depencies of task that require this one.
// If the number of dependencies becomes 0, then the task can be done.
for (auto j : precedes[task]) {
if (--degree[j] == 0)
available[computer[j]].push_back(j);
}
}
if (num_done == n)
return cost;
cost++;
cur = move_to[cur];
}
return -1;
} int main() {
int i, j, k, res;
cin >> n;
for (i = 1; i <= n; i++)
cin >> computer[i];
for (i = 1; i <= n; i++) {
cin >> in_degree[i];
for (k = 0; k < in_degree[i]; k++) {
cin >> j;
precedes[j].push_back(i);
}
}
res = min(Simulate(1), Simulate(2));
res = min(res, Simulate(3));
printf("%d\n", res);
return 0;
}

#include
#include
#include
#include
using namespace std;
const int MAX = 200 + 1;
int move_to[4] = {0, 2, 3, 1};
int computer[MAX], in_degree[MAX], n;
vector precedes[MAX]; // Simulate the game starting at computer 'start_at'.
int Simulate(int start_at) {
vector available[4];
int i, num_done = 0, cost = 0, cur = start_at, num_processed[4] = {0,0,0,0}, degree[MAX];
memcpy(degree, in_degree, sizeof degree);
// Check what tasks do not have any dependencies and add them to the available lists.
for (i = 1; i <= n; i++)
if (degree[i] == 0)
available[computer[i]].push_back(i); for (;;) {
for (; num_processed[cur] < (int)available[cur].size(); num_processed[cur]++) {
int task = available[cur][num_processed[cur]];
cost++;
num_done++;
// Process this task. Decrease the number of depencies of task that require this one.
// If the number of dependencies becomes 0, then the task can be done.
for (auto j : precedes[task]) {
if (--degree[j] == 0)
available[computer[j]].push_back(j);
}
}
if (num_done == n)
return cost;
cost++;
cur = move_to[cur];
}
return -1;
} int main() {
int i, j, k, res;
cin >> n;
for (i = 1; i <= n; i++)
cin >> computer[i];
for (i = 1; i <= n; i++) {
cin >> in_degree[i];
for (k = 0; k < in_degree[i]; k++) {
cin >> j;
precedes[j].push_back(i);
}
}
res = min(Simulate(1), Simulate(2));
res = min(res, Simulate(3));
printf("%d\n", res);
return 0;
}

More Interesting

En un algoritmo, ¿cuál es el significado real de la complejidad del espacio?

¿Existen constructores de algoritmos comerciales Plug and Play que no requieren ninguna habilidad de codificación?

¿Cuál sería el plan de trabajo general o el calendario para as en programación competitiva?

¿Cuál es una versión más amigable para principiantes de CLRS para algoritmos de aprendizaje? ¿Estaría rompiendo la entrevista de codificación?

Cómo encontrar la longitud máxima de la submatriz en una matriz determinada

¿Qué algoritmo usa la radio de Spotify para elegir las canciones?

¿Cuáles son las mejores rutinas que podemos adoptar para ser buenos en la programación / diseño de algoritmos?

¿Dónde y cómo puedo aprender sobre la creación / comprensión de algoritmos de negociación de acciones?

¿Cuál crees que es la razón por la cual las personas pueden resolver acertijos complejos? ¿Es práctica o nacen genios?

¿Por qué usarías una cola en lugar de una lista vinculada? ¿No es una cola una versión peor de una lista vinculada?

¿Qué se puede lograr de los algoritmos de aprendizaje? ¿Conducirá a un individuo a ser un mejor programador?

Cómo saber si un algoritmo es [matemática] O (n) [/ matemática], [matemática] O (2n) [/ matemática] o [matemática] O (n ^ 2) [/ matemática]

¿Ha habido algún trabajo teórico que delinee qué clase de algoritmos pueden y no pueden mapearse para mapear / reducir?

¿Cuál es la estructura de árbol más eficiente para crear un índice para un almacén en memoria?

¿Cuál es la diferencia entre Segment Tree y Fenwick Tree en términos de operaciones?