Comentário por Lúcio Figueiredo, Luca Dantas e Anita Almeida
Para conferir a prova na íntegra, clique aqui.
Binário
Conhecimento Prévio Necessário:
Para resolver este problema, vamos utilizar a seguinte observação:
Observação: Em um vetor binário , defina como maior índice tal que ; de forma similar, defina como o menor índice tal que . O vetor será um vetor ordenado crescentemente se e somente se .
Para resolvermos o problema, precisamos de uma estrutura de dados que consiga armazenar dinamicamente (ou seja, com operações de update) os índices e . Uma estrutura que satisfaz esta condição é o Set; podemos utilizar dois sets, e , que guardam todos os índices do vetor que contém e , respectivamente. Assim, é facil manter os dois sets após uma operação de update: se o índice teve seu valor modificado, basta remover de e inserir no outro set. Para responder se o vetor está ou não ordenado, utilizaremos a observação acima, conferindo se o maior elemento de (ou seja, ) é ou não menor que o menor elemento de (ou seja, ).
Como utilizamos um set em cada operação de update, a complexidade final da solução é . Segue o código, com comentários, para melhor compreensão do problema:
Eleições da Nlogônia
Conhecimento Prévio Necessário:
Para esse problema temos 4 casos para analisar: ou algum dos 3 candidatos ganham a eleição (caso tenha mais que 50% dos votos, que numericamente representa 500 votos), ou nenhum candidato alcançou mais que 500 votos e isso significa que a eleição irá para o segundo turno. Para sabermos qual a opção correta basta utilizarmos as estruturas condicionais considerando todos os casos. Segue o código para melhor compreensão:
Operações
Conhecimento Prévio Necessário:
Inicialmente, observe que se fizermos uma operação que remove alguns números de valor , não é ótimo realizar outra operação que remove números de mesmo valor, já que estes poderiam ser incuídos na primeira operação. Logo, em uma solução ótima, cada operação realizada remove números com valores distintos entre si. Portanto, podemos concluir que a resposta para o problema é a quantidade de valores distintos presentes no vetor.
Para calcularmos quantos valores distintos existem no vetor, podemos utilizar um vetor de booleanos , tal que se o valor está presente no vetor, e caso contrário. Este vetor pode ser calculado assim que os números são dados na entrada. Assim, a resposta final para o problema é igual à quantidade de índices de que são iguais a . Como o vetor tem tamanho igual ao maior elemento da entrada, a complexidade final da solução é , onde é o valor do maior elemento presente no vetor.
Nota: Uma outra forma de encontrar a quantidade de números distintos no vetor utiliza a estrutura de dados Set. Nesta solução, basta inserir os valores da entrada em um set e, em seguida, imprimir como resposta o tamanho do set. A complexidade desta solução é , e é uma solução particularmente boa caso os números da entrada possam ser muito grandes.
Segue o código, com comentários, para melhor compreensão do problema: