Problema de sueño del gato M3

tema

Como todos sabemos, hay un gato mágico en la casa de TT. Este gato está muy letárgico. No hay día y noche cuando duermes. ¡Miau puede dormir varias veces al día! ! Duerme todo el tiempo que quieras dormir todo el tiempo╯ (╯ ^ ╰) period
El período de tiempo para que el maullido duerma es continuo, es decir, una vez que el maullido comienza a dormir, no puedes ser molestado, de lo contrario el maullido morderá [○ ・ ` Д´ ・ ○ ] Se
puede suponer que Meow debe dormir durante al menos A horas seguidas, es decir, una vez que Meow comienza a dormir, no se puede molestar durante al menos A horas consecutivas (es decir, A * 60 minutos).
Ahora sabes que Meow Meow es muy letárgico, ha estado comiendo, bebiendo, tirando, extendiendo y durmiendo todo el día, en otras palabras, ¡está durmiendo o despierto!
Como todos sabemos, este gato mágico es vago, tan vago como TT, no puede estar activo más de B horas seguidas.
El dueño del gato no necesita trabajar y no necesita escribir código, es muy cómodo, por lo que duerme cuando quiere.
Sin embargo, hay una cosa en la que los dueños de gatos están interesados ​​ahora, que es el nuevo programa en el sitio web de BiliBili.
Se ha publicado en la cabecera del horario de reproducción del nuevo programa (se usa el mismo horario todos los días), ¡y debe estar despierto durante este tiempo! !
Como un maullido, piensa que es problemático organizar el tiempo. Ahora por favor ayúdelo a organizar el horario para dormir.

Entrada

Varios conjuntos de datos, varios conjuntos de datos, varios conjuntos de datos, el formato de cada conjunto de datos es el siguiente:
Ingrese tres números enteros en la línea 1, A y B y N (1 <= A <= 24, 1 <= B <= 24, 1 <= n <= 20)
La segunda a N + 1 líneas son el nuevo horario diario, cada línea tiene un período de tiempo, el formato es como hh: mm-hh: mm (intervalo cerrado), que es un formato de tiempo , El rango de hh: mm es de 00:00 a 23:59. Tenga en cuenta que se garantiza que los períodos de tiempo no se superpondrán, pero puede haber un nuevo ventilador que cruza la noche, es decir, la hora de inicio del nuevo ventilador es mayor que la hora de finalización.
Asegúrese de que la hora de inicio y la hora de finalización de cada período de tiempo sean diferentes, es decir, no puede ocurrir un período de tiempo como 08: 00-08: 00. El cálculo de la duración es un poco complicado porque es un intervalo cerrado. Por ejemplo, la duración de 12: 00-13: 59 es de 120 minutos.
No hay garantía de que el horario recién ingresado esté en orden.

Salida

Sabemos que la gestión del tiempo es un trabajo difícil, por lo que es posible que no puedas organizarlo tan bien que este período de tiempo cumpla con los requisitos de miau, es decir, cada vez que duermas debe ser continuo y no menos de una hora, y cada vez que te despiertas. El tiempo debe ser continuo y no mayor a B horas, y debe poder leer todos los episodios, por lo que la primera línea de salida es Sí o No, que representa si existe un método de gestión del tiempo que cumpla con los requisitos de Maomao.
Luego, para administrar el tiempo, solo necesita decirle a Meow cuándo se irá a la cama.
Es decir, la segunda línea genera un número entero k, que representa cuántos períodos de tiempo hay para dormir ese día. Las
siguientes k líneas son los períodos de tiempo de sueño de Meow. Cada línea tiene un período de tiempo. El formato es hh: mm-hh: mm (intervalo cerrado) , Esto también se definió anteriormente. Tenga en cuenta que si el tiempo de sueño de Miau se extiende desde el día hasta mañana, por ejemplo, de 23:50 a 0:40, la salida 23: 50-00: 40, si duerme desde las 23:50 de esta noche hasta mañana por la mañana 7:30, luego salida 23: 50-07: 30.
¿Debe ordenarse la salida? (La salida codificada se puede pasar, es decir, el orden del período de tiempo de salida no es necesario para la pregunta)
Oh, por cierto, Miao Miao le dice que esta pregunta es un juez especial, si su salida responde y muestra No es lo mismo, y puede que sea correcto. Tiene un procedimiento de evaluación para juzgar su respuesta (por supuesto, definitivamente puede juzgar su propia respuesta a simple vista)

Entrada de muestra

12 12 1
23: 00-01: 00
3 4 3
07: 00-08: 00
11: 00-11: 09
19: 00-19: 59

Salida de muestra


1
01: 07-22: 13
No

Ideas

Para la conveniencia del cálculo del tiempo, todo se puede convertir a minutos. Construya una estructura en la que se registren la hora de inicio y la hora de finalización de cada ventilador. Si la hora de finalización es menor que la hora de inicio, demuestra que la noche ha terminado. Aquí puede agregar 60 * 24 a la hora de finalización. En el momento de leer los datos, si el tiempo de un ventilador es mayor que el tiempo máximo que puede estar despierto, se juzga directamente que no. Luego, ordena todo el tiempo leído según la hora de inicio. Luego, comience desde el primer ventilador y registre cuándo estaba despierto para determinar si puede continuar mirando el ventilador, y registre la hora de finalización del ventilador anterior para determinar si puede dormir. Cada vez que pase al siguiente ventilador, calcule la hora de inicio de este ventilador y si puede dormir entre la hora de finalización del ventilador anterior. Si es posible, registre el tiempo de descanso y registre el tiempo de este ventilador. , Es decir, la hora de inicio y la hora de finalización. Si no puede dormir, juzgue si puede seguir mirando, es decir, desde el último despertar hasta el final de este episodio, si este período de tiempo es mayor que el tiempo máximo que puede despertarse, si es así, no puede tener éxito. De lo contrario, solo se registra la hora de finalización porque la hora de inicio no ha cambiado. Entre ellos, el último ventilador debe procesarse por separado, porque la hora de este ventilador se puede considerar como una matriz circular, y la hora del último ventilador afectará la hora de mañana. Estoy aquí para juzgar si puedo dormir entre el final de este último episodio y el comienzo del primer episodio de mañana. No lo he grabado. De lo contrario, juzgue el tiempo entre la última hora de inicio y la primera vez que se puede descansar en el registro actual. Si es mayor que B, falla. Finalmente, genere todo el tiempo de descanso registrado.

Punto de optimización

  1. scanf ("% d:% d-% d:% d", & h1, & m1, & h2, & m2);
  2. printf ("% 02d:% 02d-% 02d:% 02d \ n",);
  3. Convertido a la cuenta de minutos MM en lugar de HH: MM
  4. Convierta al sistema de 48 horas, inserte el primer período de tiempo +24 al final del horario

error

1. Tenga en cuenta que si el tiempo de vigilia continuo no excede B, no el tiempo total de vigilia no excede B.
2. Tenga en cuenta que el tiempo de vigilia no puede ser de 24 horas, lo que hará que el gato nunca duerma y haga que el tiempo de vigilia sea superior a 24 horas

Código

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

struct T{
    
    
	int S; 
	int E; 
	bool operator <(const T &t)const{
    
    
		if(S!=t.S) return S<t.S;
	}
};
T Time[100];
T ans[100];
int tot;
int A,B,N;
int main(){
    
    

	int a,b,c,d;
	while(cin>>A>>B>>N){
    
     
		A*=60, B*=60; 
		tot=0;
		int ret=1; 
		memset(Time,0,sizeof(Time));
		memset(ans,0,sizeof(ans));
		for(int i=0; i<N;i++)
		{
    
    
			scanf("%d:%d-%d:%d",&a,&b,&c,&d);
			Time[i].S=a*60+b;
			Time[i].E=c*60+d;
			if(Time[i].S>Time[i].E) 
				Time[i].E+=24*60; 
			if(Time[i].E-Time[i].S>B)
			{
    
    
				ret=0;
				break;
			}
		}
		sort(Time,Time+N);
		
		T last;
		last.S=Time[0].S, last.E=Time[0].E;
				
		for(int i=1;i<N;i++)
		{
    
    
			int tmp=Time[i].S-last.E-1;
			if(tmp>=A)
			{
    
      
				ans[tot].S=last.E+1;
				ans[tot].E=Time[i].S-1;
				last=Time[i]; 
				tot++;
			}
			else
			{
    
    
				last.E=Time[i].E;
				if(last.E-last.S+1>B)
				{
    
     
					ret=0;
					break;
				} 			
			}
		}	
		if(!ret)
		{
    
    
			cout<<"No"<<endl;
			continue; 
		} 
		if(Time[0].S+24*60-last.E-1>=A)
		{
    
     
			ans[tot].S=(last.E+1)%(60*24);
			ans[tot].E=(Time[0].S+60*24-1)%(60*24);
			tot++; 
		}
		else if(tot==0||(ans[0].S-1+60*24)%(60*24)-last.S+1>B)
		{
    
     
			cout<<"No"<<endl;
			continue;
		}	
		cout<<"Yes"<<endl;
				cout<<tot<<endl; 
		for(int i=0;i<tot;i++)
		{
    
    
			int eh=ans[i].S/60;
			int em=ans[i].S%60;
			int sh=ans[i].E/60;
			int sm=ans[i].E%60;
			printf("%02d:%02d-%02d:%02d\n",eh,em,sh,sm);
		}		
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/alicemh/article/details/106594539
Recomendado
Clasificación