Otras preguntas de práctica (sin categorizar)

Descripción El
pequeño auditorio de la escuela tiene muchas actividades todos los días. Cuando hay tiempo, el tiempo planificado para estas actividades entrará en conflicto y algunas actividades deben seleccionarse para realizarlas.
El trabajo de Xiao Liu es organizar actividades en el pequeño auditorio de la escuela, con como máximo una actividad en cada momento. Ahora Xiao Liu tiene un cronograma de algunos planes de actividades.
Quiere organizar tantas actividades como sea posible. Puedo preguntarle cómo organizarlo.

Entrada La
primera línea es un número entero m (m <100) lo que significa que hay m grupos de datos de prueba.
La primera línea de cada grupo de datos de prueba es un número entero n (1 <n <10000), lo que significa que hay n actividades en los datos de prueba.
Las siguientes n filas, cada fila tiene dos enteros positivos Bi, Ei (0 <= Bi, Ei <10000), que representan respectivamente la hora de inicio y finalización de la i-ésima actividad (Bi <= Ei)

Salida
Para cada grupo de entradas, dé salida al número máximo de actividades que se pueden programar.
La salida de cada grupo ocupa una línea

Entrada de muestra
2
1 10
10 11

3
1 10
10 11
11 20

Salida de muestra
1
2

Punto de reflexión:
Este problema es más conveniente de resolver aplicando ordenar en STL. Ordene en orden ascendente según la hora en que finaliza la actividad, y luego juzgue la hora de inicio de la siguiente actividad y la hora de finalización de la actividad anterior, y compárelo, si la diferencia es mayor que 1, luego el recuento aumenta en 1.

#include<iostream>
#include<algorithm>
using namespace std;

struct meet
{
    
    
	int start;
	int end;
}a[100010];

bool cmp(meet a, meet b)               //按会议结束时间排列                 
{
    
    
	return a.end<b.end;
}

int main()
{
    
    
	int n;
	cin>>n;
	for (int i = 1; i <= n; i++)
	{
    
    
		cin >> a[i].start;
		cin >> a[i].end;
	}
	a[0].start = -1;
	a[0].end = -1;
	sort(a + 1, a + n + 1, cmp);  //排列
	int sum = 1;
	int j = 1;
	for (int i = 2; i <= n; i++)  //从第二个会场开始从与前一个会场比较
	{
    
    
		if (a[i].start>a[j].end)  //如果相隔时间大于1(输入都为整数),则活动数+1
		{
    
    
			j = i;
			sum++;
		}
	}
	cout << sum << endl;

	system("pause");
	return 0;
}

Reflexión del código postal: el
punto clave sigue siendo la conversión del problema, y ​​el problema debe convertirse de manera razonable, de modo que el problema sea mucho más fácil de resolver.

Supongo que te gusta

Origin blog.csdn.net/qq_27538633/article/details/105911595
Recomendado
Clasificación