Examen de certificación informática CCF 201709-2: Caja de clave pública Versión de pollo débil sin algoritmo

caja de clave pública

tema:

Hay una escuela donde los profesores comparten aulas N. De acuerdo con las normas, todas las llaves deben colocarse en la caja de llaves públicas y el profesor no puede llevarse las llaves a casa. Cada vez que el maestro va a clase, encuentra la llave del aula a la que asiste en la caja de llaves pública para abrir la puerta y vuelve a poner la llave en la caja de llaves después de que termina la clase.
  La caja de llaves tiene un total de N ganchos, que están dispuestos en fila de izquierda a derecha, y se utilizan para colgar las llaves de N aulas. Un manojo de llaves no tiene una posición fija para colgar, pero las llaves están marcadas para que los maestros no las confundan.
  Cada vez que se toma una llave, los profesores encontrarán la llave que necesitan y se la llevarán sin mover otras llaves. Cada vez que se devuelva la llave, el profesor que la devuelva encontrará el gancho vacío en el extremo izquierdo y colgará la llave en este gancho. Si más de un profesor devuelve las llaves, las devuelven en orden ascendente de los números de llave. Si el maestro devuelve la llave y el maestro toma la llave al mismo tiempo, los maestros primero devolverán todas las llaves y luego las sacarán.
  Al comienzo de hoy, las llaves se colocan en la caja de llaves en orden de número de menor a mayor. Hay K maestros que quieren ir a clase. Dale a cada maestro la llave que necesita, el tiempo para comenzar la clase y la duración de la clase. Suponiendo que el final de la clase es el momento de devolver las llaves, ¿cuál es el orden de las llaves en el último cuadro de llaves?

Formato de entrada:

La primera línea de entrada contiene dos números enteros N, K.
  A continuación, las K líneas, cada línea tiene tres números enteros w, s, c, que representan respectivamente el número clave que debe usar un maestro, la hora en que comienza la clase y la duración de la clase. Puede haber varios profesores usando la misma clave, pero el tiempo que los profesores usan la clave no se superpondrá.
  Asegúrese de que los datos de entrada cumplan con el formato de entrada, y no necesita verificar la legalidad de los datos.

Formato de salida:

Muestra una línea que contiene N enteros, separados por un espacio entre enteros adyacentes, que a su vez representan el número de la llave colgada en cada gancho.

Ejemplo de entrada:

5 2
4 3 3
2 2 7

Salida de muestra:

1 4 3 2 5

Ejemplo de descripción:

El primer maestro usa la llave del salón 4 del tiempo 3 y usa 3 unidades de tiempo, entonces devuelva la llave en el tiempo 6. El segundo maestro comienza a usar la llave en el tiempo 2 y usa 7 unidades de tiempo, así que devuelva la llave en el tiempo 9.
  El estado de la clave después de cada momento clave es el siguiente (X significa vacío):
  1X345 después del momento 2; 1X3X5
  después del momento 3; 143X5
  después del momento 6; 14325
  después del momento 9.

Ejemplo de entrada:

5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9

Salida de muestra:

1 2 3 5 4

Escala y acuerdo de caso de uso de evaluación:

Para el 30 % de los casos de evaluación, 1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30; para el 60 % de los casos de evaluación, 1 ≤ N, K ≤ 50, 1 ≤ w
  ≤ N, 1 ≤ s ≤ 300, 1 ≤ c ≤ 50,
  para todos los casos de evaluación, 1 ≤ N, K ≤ 1000, 1 ≤ w ≤ N, 1 ≤ s ≤ 10000, 1 ≤ c ≤ 100.

el código

#include<cstdio>
const int maxn = 1005;
struct TEACHER
{
    
    
	int w;       //教室编号
	int s;       //开始上课时间
	int c;       //上课时长
	bool borrow = false;
}teacher[maxn];

int findTeacher(int k,int i)        //该函数返回同一时刻还钥匙的老师中所持钥匙编号最小的
{
    
    
	int index = -1;
	int keyNum = 0x3f3f3f;
	for (int tump = 0; tump < k; tump++)
	{
    
    
		if (teacher[tump].borrow && teacher[tump].s+teacher[tump].c == i && teacher[tump].w<keyNum)
		{
    
    
			index = tump;
			keyNum = teacher[tump].w;
		}
	}
	if (index == -1)
	{
    
    
		return -1;
	}
	return index;
}

int main()
{
    
    
	int n, k;
	scanf("%d%d", &n, &k);
	int key[maxn];
	for (int i = 0; i < n; i++)        //初始化钥匙盒,钥匙盒内的数据代表钥匙对应编号
	{
    
    
		key[i] = i + 1;
	}
	for (int i = 0; i < k; i++)
	{
    
    
		scanf("%d%d%d", &teacher[i].w, &teacher[i].s, &teacher[i].c);
	}
	for (int i = 1; i <= 10100; i++)       //遍历秒数
	{
    
    
		//查询当前秒归还钥匙的老师
		for (int m = 0; m < n; m++)     //遍历钥匙盒
		{
    
    
			if (key[m] == 0)
			{
    
    
				int thisTeacher = findTeacher(k,i);
				if (thisTeacher == -1) continue;
				key[m] = teacher[thisTeacher].w;
				teacher[thisTeacher].borrow = false;
			}
		}
		for (int j = 0; j < k; j++)      //借钥匙
		{
    
    
			if (teacher[j].s == i)
			{
    
    
				for (int q = 0; q < n; q++)
				{
    
    
					//遍历钥匙盒
					if (key[q] == teacher[j].w)
					{
    
    
						key[q] = 0;
					}
				}
				teacher[j].borrow = true;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
    
    
		printf("%d ", key[i]);
	}
	return 0;
}

Analizar gramaticalmente:

El mayor escollo es el mecanismo de devolución de llaves. El título establece que, al mismo tiempo, si el segundo maestro toma prestada la llave con el mismo número de llave que el maestro que devolvió la llave, primero devuelve la llave y luego la toma prestada. Si varios maestros devuelven las llaves al mismo tiempo, devuelva las llaves de izquierda a derecha de acuerdo con el número de llaves prestadas por los maestros, de menor a mayor.

y no se puede usar cuando se toma prestada la llave

key[teacher[j].w - 1] = 0;    //因为经过借还之后钥匙的顺序会发生改变,不再是有序的

para registrar que la clave ha sido prestada (me equivoqué aquí y nunca la encontré).

Supongo que te gusta

Origin blog.csdn.net/qq_32577169/article/details/100731188
Recomendado
Clasificación