A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Resolução comentada do problema "Desordens" Prof. Adolfo Neto Departamento Acadêmico de Informática Universidade Tecnológica Federal do Paraná

Apresentações semelhantes


Apresentação em tema: "Resolução comentada do problema "Desordens" Prof. Adolfo Neto Departamento Acadêmico de Informática Universidade Tecnológica Federal do Paraná"— Transcrição da apresentação:

1 Resolução comentada do problema "Desordens" Prof. Adolfo Neto Departamento Acadêmico de Informática Universidade Tecnológica Federal do Paraná http://www.dainf.ct.utfpr.edu.br/~adolfo Agosto de 2008

2 Índice Apresentação do problema Idéia do algoritmo Refinamentos sucessivos Programa em C padrão ANSI Referências

3 Apresentação do Problema Problema obtido no sítio da Olimpíada Brasileira de Informática:http://olimpiada.ic.unicamp.br/http://olimpiada.ic.unicamp.br/

4 Apresentação do Problema O problema está na seção ”Modalidade Iniciação”, subseção ”Modalidade Iniciação Nível 1”. É um exemplo de tarefa de computação considerada de nível médio.

5 Apresentação do Problema Uma permutação dos números de 1 a N é uma seqüência de números a1, a2,... aN na qual cada um dos números de 1 a N aparece exatamente uma vez. Uma desordem de uma permutação é uma nova permutação que se obtém ao realizar um conjunto de intercâmbios de pares de números na permutação origem de tal forma que cada número seja intercambiado no máximo uma vez.a intercambiando 5 com 4.

6 Apresentação do Problema 1. Tarefa Sua tarefa é determinar a menor quantidade de desordens necessárias para transformar a permutação 1, 2,... N em uma outra permutação dada (chamada de permutação objetivo). Por exemplo, com N=5, para obter-se a permutação 3, 4, 1, 5, 2 são necessárias duas desordens: a primeira intercambiando 1 com 3, e 2 com 5; a segunda intercambiando 5 com 4.

7 Apresentação do Problema 2. Dados Cada conjunto de teste que você receberá é composto por duas linhas. A primeira linha contém um inteiro positivo, N, que indica a quantidade de números da permutação. A segunda linha contém a permutação objetivo, composta de N inteiros positivos, separados por espaço em branco.

8 Apresentação do Problema Exemplo de Dados 5 3 4 1 5 2 7 3 2 1 7 6 5 4

9 Apresentação do Problema 3. Resposta Para cada conjunto de teste você deve produzir duas linhas na resposta. A primeira linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. A segunda linha deve conter o número de desordens necessá para se atingir a permutação objetivo.

10 Apresentação do Problema Exemplo de Resposta Teste 1 2 Teste 2 1 (esta resposta corresponde ao exemplo de dados acima)

11 Apresentação do Problema 4. Restrições 1 <= N <= 10.000 5. Conjuntos de Testes Clique aquiClique aqui para acessar os conjuntos de testes. 6. Gabarito Clique aquiClique aqui para acessar o gabarito utilizado na correção

12 Idéia do algoritmo Para cada conjunto de teste há: Uma permutação inicial: 1, 2, 3,..., N Uma permutação objetivo que é recebida como entrada É simples observar que: Cada permutação será armazenada num vetor O vetor que armazenar a permutação inicial também armazenará as permutações resultantes das desordens

13 Idéia do algoritmo Esboço do programa Enquanto ! (atual == objetivo) faz_desordem(atual,objetivo) desordens++ Precisamos ter: Uma função que verifica se dois vetores são iguais (!= não funciona com vetores) Uma função que faz uma desordem num vetor

14 Refinamentos sucessivos Ref. atual == objetivo int iguais (int vetor1[], int vetor2[], int tam){ int result=1; int i; for (i=0; i<tam; i++) if (vetor1[i]!=vetor2[i]) return 0; }

15 Refinamentos Sucessivos Ref. faz_desordem(atual,objetivo) Usar um vetor de modificados para registrar os valores do vetor atual que já foram trocados nesta desordem

16 Refinamentos Sucessivos Ref. faz_desordem(atual,objetivo) - cont. Vai olhando um por um do vetor objetivo. Se na posição i do vetor atual: atual[i] != objetivo[i] atual[i] não foi trocado ainda nesta desordem Então Troca o atual[i] com atual[posição de objetivo[i] em atual] Marca que as posições i e ”posição de objetivo[i] em atual” foram trocadas

17 Refinamentos Sucessivos faz_desordem (int vetor1[], int vetor2[], int tam){ int i, aux, pos, modificado[MAX]; for (i=0;i<tam;i++) modificado[i]=0; for (i=0; i<tam; i++){ aux = vetor2[i]; pos=posicao_de_em(vetor2[i],vetor1,tam); if (!modificado[i] && !modificado[pos] && vetor1[i]!=vetor2[i]){ vetor1[pos]=vetor1[i]; vetor1[i]=aux; modificado[i]=1; modificado[pos]=1; }}}

18 Programa em C #includes Protótipos de funções Função main() Implementação das funções

19 Programa em C Função main(): leitura dos dados inicia(atual,N); while (!iguais(atual, objetivo, N)){ faz_desordem(atual, objetivo, N); desordens++; } printf("Teste %d\n",++contador); printf("%d\n",desordens);

20 Programa em C inicia(int vetor[], int tam){ int i; for(i=0; i<tam;i++){ vetor[i]=i+1; }

21 Programa em C int posicao_de_em(int valor, int vetor[], int tam){ int i; for (i=0; i<tam; i++) if (valor == vetor[i]) return i; return -1; }

22 Programa em C Como receber vários conjuntos de teste? Por exemplo: 5 3 4 1 5 2 7 3 2 1 7 6 5 4

23 Programa em C Como receber vários conjuntos de teste? while(scanf("%d",&N)==1){ leitura da permutação objetivo todo o resto descrito anteriormente como conteúdo da função main() } Supõe-se que a entrada esteja correta exceto pelo valor de N: deve-se verificar se está no intervalo [1,10000]

24 Referências Site da Olimpíada Brasileira de Informática: http://olimpiada.ic.unicamp.br/ http://olimpiada.ic.unicamp.br/


Carregar ppt "Resolução comentada do problema "Desordens" Prof. Adolfo Neto Departamento Acadêmico de Informática Universidade Tecnológica Federal do Paraná"

Apresentações semelhantes


Anúncios Google