Red social (versión fácil)

Red social (versión fácil)

CodeForces 1234B1

Esta es una pregunta que me hice durante el entrenamiento. Para cumplir con los requisitos anteriores, tuve que sacarla (doge). Esta pregunta todavía es un poco representativa, así que escriba un registro

1. Contenido de la asignatura

La única diferencia entre las versiones fáciles y duras son las restricciones en n y k.

Está enviando mensajes en una de las redes sociales populares a través de su teléfono inteligente. Su teléfono inteligente puede mostrar como máximo las k conversaciones más recientes con sus amigos. Inicialmente, la pantalla está vacía (es decir, el número de conversaciones mostradas es igual a 0).

Cada conversación es entre tú y algunos de tus amigos. Hay como máximo una conversación con cualquiera de tus amigos. Así que cada conversación la define tu amigo de forma única.

Tú (¡de repente!) Tienes la capacidad de ver el futuro. Sabes que durante el día recibirás nn mensajes, el i -ésimo mensaje se recibirá del amigo con ID idi (1≤idi≤10 ^ 9).

Si recibe un mensaje de idi en la conversación que se muestra actualmente en el teléfono inteligente, entonces no pasa nada: las conversaciones de la pantalla no cambian y no cambian su orden, lee el mensaje y continúa esperando nuevos mensajes.

De lo contrario (es decir, si no hay conversación con idi en la pantalla):

· En primer lugar, si el número de conversaciones que se muestran en la pantalla es kk, la última conversación (que tiene la posición k) se elimina de la pantalla.
· Ahora se garantiza que el número de conversaciones en la pantalla será menor que ky la conversación con el amigo idi no se muestra en la pantalla.
· La conversación con el amigo idiota aparece en la primera posición (la más alta) en la pantalla y todas las demás conversaciones mostradas se desplazan una posición hacia abajo.

Su tarea es encontrar la lista de conversaciones (en el orden en que se muestran en la pantalla) después de procesar los n mensajes.

输入 格式
La primera línea de la entrada contiene dos números enteros n y k (1≤n, k≤200): la cantidad de mensajes y la cantidad de conversaciones que puede mostrar su teléfono inteligente.

La segunda línea de la entrada contiene n números enteros id1, id2, ……, idn (1≤idi≤10 ^ 9), donde idi es el ID del amigo que le envía el i -ésimo mensaje.

输出 格式
En la primera línea de la salida imprima un entero m (1≤m≤min (n, k)) - el número de conversaciones que se muestran después de recibir todos los n mensajes.

En la segunda línea, escriba m enteros ids1, ids2, ……, idsn, donde idsi debe ser igual al ID del amigo correspondiente a la conversación que se muestra en la posición i después de recibir todos los n mensajes.

Traducción del título :
Conoce los mensajes que se le enviarán N veces en el futuro, y el software de chat solo puede mostrar los registros de chat con K (1≤K≤200) personas a la vez.

Cuando reciba un mensaje, si el historial de chat con esta persona se muestra en el software de chat, no haga nada (tenga en cuenta que no es necesario que coloque el historial de chat actual en la parte superior); de lo contrario, si actualmente se muestra el historial de chat K, entonces Elimina el último registro de chat; agrega el registro de chat con esta persona en la parte superior de la lista, mientras que otros registros de chat bajan una posición.

Pregunte después de que se envíen estos N mensajes, su software de chat eventualmente mostrará el historial de chat con las personas.

La primera línea del formato de entrada son
dos enteros positivos N, K (1≤N, K≤200), que representan N mensajes enviados y el número de registros de chat mostrados a la vez.

La siguiente línea de N id entero positivo [i] (1≤id [i] ≤200) es el remitente del i-ésimo mensaje.

La primera línea del formato de salida
, muestra el número de registros de chat X que se muestran en la última pantalla.

En la siguiente línea, se generan X números enteros positivos y los objetos del historial de chat que se muestran en la última pantalla se muestran en orden.

说明 / 提示 : En el primer ejemplo, la lista de conversaciones cambiará de la siguiente manera (en orden del primer al último mensaje):
[];
[1];
[2, 1];
[3, 2];
[3, 2];
[1, 3];
[1, 3];
[2, 1].

En el segundo ejemplo, la lista de conversaciones cambiará de la siguiente manera:
[];
[2];
[3, 2];
[3, 2];
[1, 3, 2];

y luego la lista no cambiará hasta el final.

Entrada y salida de muestra

Ingrese # 1

7 2
1 2 3 2 1 3 2

Entrada # 2

10 4
2 3 3 1 1 2 1 2 3 3

Salida # 1

2
2 1 

Salida # 2

3
1 3 2 

2. Pensamiento personal

De manera similar a QQ y WeChat, la pantalla solo puede contener k mensajes (si no se despliegan). La diferencia es que esta pregunta estipula que la ventana de conversación del nuevo mensaje ya apareció en la pantalla y no se colocará en la parte superior. Solo se enviará la ventana de conversación fuera de la pantalla. Los mensajes nuevos se encabezarán y el mensaje inferior se completará. Tampoco hay cobertura artificial.
Aquí primero usamos un mapeo b para mantener los registros que existen en el registro actual. Cada vez que se lee un dato, primero se juzga si está en el registro. Si no lo está, se escribe y se juzga. El código es el siguiente:

#include<stdio.h>
#include<map>
using namespace std;
map<int,bool>b;
const int N=200020;
int a[N];
int main()
{
    
    
	int n,k,m=0,s=0,t,i;
	scanf("%d%d",&n,&k);//n条发来的信息和当前最多k条显示聊天记录
	for(i=0;i<n;i++)
	{
    
    
		scanf("%d",&t);//有t个人发来消息
		if(!b[t])//如果之前没有这个人的消息
		{
    
    
			b[t]=true;//新增记录,写入
			a[++m]=t;
			if(m-s>k)//消息数超过显示数
				b[a[++s]]=false;//把最下面那一条顶下去
		}
	}
	printf("%d\n",m-s);//屏幕最后显示的消息条数
	while(m>s)
		printf("%d ",a[m--]);//聊天对象
	return 0;
}

---------------------------------------Línea divisoria--------- --------------------------------

El código anterior es el código que escribí cuando era un pequeño konjac, y luego se convirtió en un gran konjac (triste) Descubrí que también se puede hacer con una cola. Esta pregunta se ajusta a la función de la cola primero en entrar, primero en salir. Si la longitud actual de la cola es k , El elemento en la posición k-ésima de la cola se quita de la cola. Si la longitud de la cola es menor que ky idi no ha aparecido en la cola, idi entrará al principio de la cola, y los otros elementos se moverán un bit hacia atrás, y finalmente saldrá la cola. Código:

#include<iostream>
#include<queue>
#include<map>
using namespace std;
queue<int>q;//使用STL模板
map<int,bool>b;
int a[200020];
int main()
{
    
    
    int n,k,x;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>x;
        if(!b[x])//入队
        {
    
    
            b[x]=1;
            q.push(x);
        }
        if(q.size()>k)//出队
        {
    
    
            b[q.front()]=0;
            q.pop();
        }
    }
    int t=q.size();
    cout<<t<<endl;
    for(int i=1;i<=t;i++)
    {
    
    
        a[i]=q.front();
        q.pop();
    }
    for(int i=t;i>=1;i--)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

Los códigos anteriores se han probado en la plataforma Luogu, todos son AC

para resumir

Esta pregunta es más fácil de hacer si está familiarizado con el algoritmo y comprende el significado de la pregunta. Puede usar una matriz o una cola para mantener el registro actual y simular de acuerdo con el significado de la pregunta.

Supongo que te gusta

Origin blog.csdn.net/jotaro07/article/details/110265947
Recomendado
Clasificación