Algorithm
Problem Name: 2 AD-HOC - beecrowd | 2460
Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2460
Fila
Por OBI - Olimpíada Brasileira de Informática 2014 Brazil
Timelimit: 1
Com a proximidade da Copa do Mundo, o fluxo de pessoas nas filas para compra de ingressos aumentou consideravelmente. Como as filas estão cada vez maiores, pessoas menos pacientes tendem a desistir da compra de ingressos e acabam deixando as filas, liberando assim vaga para outras pessoas. Quando uma pessoa deixa a fila, todas as pessoas que estavam atrás dela dão um passo a frente, sendo assim nunca existe um espaço vago entre duas pessoas. A fila inicialmente contém N pessoas, cada uma com um identificador diferente. Joãozinho sabe o estado inicial dela e os identificadores em ordem das pessoas que deixaram a fila. Sabendo que após o estado inicial nenhuma pessoa entrou mais na fila, Joãozinho deseja saber o estado final da fila.
Entrada
A primeira linha contém um inteiro N (1 ≤ N ≤ 50000) representando a quantidade de pessoas inicialmente na fila. A segunda linha contém N inteiros representando os identificadores das pessoas na fila. O primeiro identificador corresponde ao identificador da primeira pessoa na fila. É garantido que duas pessoas diferentes não possuem o mesmo identificador. A terceira linha contém um inteiro M (1 ≤ M ≤ 50000 e M < N) representando a quantidade de pessoas que deixaram a fila. A quarta linha contém M inteiros representando os identificadores das pessoas que deixaram a fila (cada identificador está entre 1 e 100000), na ordem em que elas saíram. É garantido que um mesmo identificador não aparece duas vezes nessa lista.
Saída
Seu programa deve imprimir uma linha contedo N − M inteiros com os identificadores das pessoas que permaneceram na fila, em ordem de chegada.
Exemplos de Entrada | Exemplos de Saída |
8 5 100 9 81 70 33 2 1000 3 9 33 5 |
100 81 70 2 1000 |
Code Examples
#1 Code Example with C Programming
Code -
C Programming
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
typedef struct{
unsigned short numero;
unsigned short posicao;
} pessoa;
int main (void)
{
/*
qtsPessoas receberá a quantidade de pessoas na fila;
qtsPessoasSairam receberá a quantidade de pessoas que saíram da fila;
i será o índice em várias ocasiões;
idPessoa será o identificador da pessoa na fila;
fila[51000] será o vetor de struct que conterá as informações de posição e id de cada pesoa;
*/
unsigned short qtsPessoas, qtsPessoasSairam;
unsigned short i, idPessoa;
pessoa fila[51000];
scanf("%hu", &qtsPessoas);
memset(fila, 0, sizeof(fila));
// Esse laço enche a struct com os id's das pessoas na fila;
// O campo posição salva a posição da pessoa no momento da inserção,
// Entretanto não o faz na posição 'i' e sim na posição de seu id;
// Isso proporcionará um acesso instantâneo mais tarde sem precisar fazer
// Uma pesquisa linear todas as vezes que eu quiser "retirar" alguém da fila;
for (i = 0; i < qtsPessoas; i++)
{
scanf("%hu", &idPessoa);
fila[i].numero = idPessoa;
fila[idPessoa].posicao = i;
}
scanf("%hu", &qtsPessoasSairam);
// Como não há identificador '0' para ninguém
// As pessoas que saíram da fila recebem 0 na posição em que foi salva originalmente
// Mas a pesquisa é "instantânea", pois eu procuro pelo índice em que ela foi salva dentro
// da própria struct;
for (i = 0; i < qtsPessoasSairam; i++)
{
scanf("%hd", &idPessoa);
fila[fila[idPessoa].posicao].numero = 0;
}
// Aqui um truque para passar na impressão da questão
// Não pode haver espaços no começo nem no final da impressão;
// Por isso, uma variável 'flag' verifica se já foi impresso alguma coisa
// Note que pode haver o número 0 na primeira ou demais posições e ele não será impresso
// Por isso, é necessário verificar se alguma coisa já foi impressa até o momento;
bool primEspaco = false;
for (i = 0; i < qtsPessoas; i++)
if (fila[i].numero)
{
if (primEspaco == true && i != qtsPessoas)
printf(" ");
primEspaco = true;
printf("%hu", fila[i].numero);
}
printf("\n");
}
Copy The Code &
Try With Live Editor
Input
5 100 9 81 70 33 2 1000
3
9 33 5
Output
#2 Code Example with C++ Programming
Code -
C++ Programming
#include <cstdio>
#include <set>
#define MAX 50010
using namespace std;
int vetor[MAX], n, m, i, davez;
set < int> removidos;
int main() {
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &vetor[i]);
scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf("%d", &davez);
removidos.insert(davez);
}
int exibicao = 0;
for (i = 0; i < n; i++) {
if (removidos.count(vetor[i]) == 1) continue;
if (exibicao)
printf(" ");
else
exibicao = 1;
printf("%d", vetor[i]);
}
printf("\n");
return 0;
}
Copy The Code &
Try With Live Editor
Input
5 100 9 81 70 33 2 1000
3
9 33 5
Output
#3 Code Example with Javascript Programming
Code -
Javascript Programming
const { readFileSync } = require("fs")
const lines = readFileSync("/dev/stdin", "utf8")
.split("\n")
.map((line) => line.split(" ").map((value) => Number.parseInt(value, 10)))
const N = lines[0][0]
const M = lines[2][0]
const inQueue = lines[1].slice(0, N)
const outQueue = lines[3].slice(0, M)
const stillInQueue = inQueue.filter((p) => !outQueue.includes(p))
console.log(stillInQueue.join(" "))
Copy The Code &
Try With Live Editor