roblema: Valor de Nomes Slide 39 tribua-se a cada letra do alfabeto o valor indicado na tabela seguinte. 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ado um conjunto de nomes completos de pessoas, determinar um nome que nha n letras e cuja soma dos valores das suas consoantes seja mínima. O valor de é dado e não excede 50, embora possam existir nomes com mais de 50 aracteres. O número de nomes do conjunto será também indicado. Caso não exista enhum nome com n letras, o programa deverá escrever inexistente. Caso ontrário, escreve o primeiro nome que está nas condições pretendidas, e a seguir o alor das suas cosoantes.
roblema: Valor de Nomes (Cont) Slide 40 obre o Input n ( 50) o número de letras dos nomes (completos) que interessa considerar; nnomes o número de nomes completos que podem ser dados (não é limitado pelo enunciado); e ainda nn omes sequências de caracteres. Vamos supor que cada uma termina por \n e é um nome completo. Não vamos limitar o tamanho dos nomes completos que o utilizador vai poder inserir. Vamos admitir também que quaisquer duas palavras do nome podem estar separadas por um número arbitrário de espaços (maior ou igual a um). No entanto, se tivermos que escrever um nome, as palavras ficam separadas por um só espaço. Assim, se for necessário guardar um nome relevante para o problema, é suficiente (e talvez necessário) ter uma string que permita guardar 50 letras + até 49 espaços + 1 terminador, ou seja 100 caracteres.
roblema: Valor de Nomes (Cont) Slide 41 lgumas observações sobre o algoritmo 1. Se efectuarmos a leitura dum nome caracter a caracter, podemos controlar o n úmero de letras que vamos lendo. À medida que formos guardando o nome em memória, vamos garantir que cada duas palavras ficam separadas por um só espaç o. 2. Se durante a leitura, chegarmos à conclusão de que o n úmero de letras que o nome temé pelo menos n + 1, então podemos imediatamente descartá-lo. 3. Nesse caso, se estivermos a meio da leitura do nome, devemos lê-lo até ao fim (para podermos aceder ao próximo nome). 4. À medida que formos lendo as letras que formam o nome, podemos ir somando o valor das consoantes. 5. Se a soma parcial exceder a soma m ınima anteriormente encontrada, podemos descartar o nome. Se a soma final for inferior a esse m ınimo e o nome tiver n letras, devemos guardá-lo (dado que passa a ser o melhor até ao momento). 6. Podemos tomar 9n + 1 como valor m ınimo inicial. No máximo as n consoantes que constituem o nome têm valor 9n. Assim, todos os nomes relevantes têm um valor menor do que 9n + 1. 7. Precisamos de duas strings: uma para guardar o melhor nome encontrado até um dado passo, e a outra, para guardar o nome que está a ser tratado.
rograma Slide 42 include <stdio.h> define VOGAL(C) (C == A C == E C == I C == O C == U ) * o y n~ao é! */ define MAXNOME 50*2 nt processa_nome(int, char [], int, char []); ain() int n, nnomes, somamin; char nomemin[maxnome],nome[maxnome]; scanf("%d %d",&n,&nnomes); somamin = 9*n+1; while(nnomes--) somamin = processa_nome(n,nomemin,somamin,nome); if (somamin == 9*n+1) printf("inexistente\n"); else printf("%s\nsoma = %d\n",nomemin,somamin);
rograma (cont) Slide 43 t processa_nome(int n, char nomemin[], int smin, char aux[]) int nletras=0, i=0, soma=0; char c; while((c=getchar()) == c == \n ); do { do { aux[i++] = c; nletras++; if (c >= a && c <= z ) c += ( A - a ); if (!VOGAL(c)) soma += (1+(c- A )%9); while ((c=getchar())!= && c!= \n && nletras <=n && soma < smin); if (nletras > n soma >= smin) { while (c!= \n ) c=getchar(); return smin; if (c == ) { aux[i++] = c; while ( (c=getchar()) == ); while (c!= \n ); if (nletras == n && soma < smin) { for(nletras=0;nletras < i; nletras++) nomemin[nletras] = aux[nletras]; nomemin[nletras] = \0 ; return soma; else return smin;
assando somamin por referência Slide 44 include <stdio.h> define VOGAL(C) (C == A C == E C == I C == O C == U ) * o y n~ao é! */ define MAXNOME 50*2 oid processa_nome(int, char [], int *, char []); ain() int n, nnomes, somamin; char nomemin[maxnome],nome[maxnome]; scanf("%d %d",&n,&nnomes); somamin = 9*n+1; while(nnomes--) processa_nome(n,nomemin,&somamin,nome); if (somamin == 9*n+1) printf("inexistente\n"); else printf("%s\nsoma = %d\n",nomemin,somamin);
assando somamin por referência (cont) Slide 45 id processa_nome(int n, char nomemin[], int *psmin, char aux[]) int nletras=0, i=0, soma=0; char c; while((c=getchar()) == c == \n ); do { do { aux[i++] = c; nletras++; if (c >= a && c <= z ) c += ( A - a ); if (!VOGAL(c)) soma += (1+(c- A )%9); while ((c=getchar())!= && c!= \n && nletras <=n && soma < *psmin); if (nletras > n soma >= *psmin) { while (c!= \n ) c=getchar(); if (c == ) { aux[i++] = c; while ( (c=getchar()) == ); while (c!= \n ); if (nletras == n && soma < *psmin) { for(nletras=0;nletras < i; nletras++) nomemin[nletras] = aux[nletras]; nomemin[nletras] = \0 ; *psmin = soma;
asamentos Estáveis Slide 46 ados n homens e n mulheres, pretende-se formar casais tais que nenhum homem refere uma mulher que não é a sua e que o prefere ao seu marido. Supõe-se que ada pessoa ordenou os do sexo oposto por ordem de preferência estrita. Prefs dos homens Prefs das mulheres 1 2 3 4 2 4 3 1 3 4 2 1 2 4 1 3 2 3 1 4 1 2 3 4 3 1 4 2 2 4 1 3 ada linha da tabela da esquerda tem as preferências dos homens. A i-ésima linha m as preferências do i-ésimo homem (por ordem decrescente).
Slide 47 asamentos Estáveis Ideia do Algoritmo de Gale & Shapley [1962] Prefs dos homens 1 2 3 4 2 4 3 1 3 4 2 1 2 4 1 3 Prefs das mulheres 2 3 1 4 1 2 3 4 3 1 4 2 2 4 1 3 Os homens propõem-se. As mulheres aceitam (provisoriamente) se não tiverem já um parceiro de quem gostem mais. Se tiverem um parceiro de que gostam menos, rejeitam-no, para aceitar o que se está a propor. Então, o homem rejeitado vai ficar livre, e propor-se-á à próxima mulher na sua lista de preferências. Qualquer um dos homens que num dado momento está livre, pode efectuar a sua proposta. O emparelhamento final não depende da ordem pelo qual os homens se vão propondo. O algoritmo é apresentado em pseudo-código a seguir
lgoritmo de Gale-Shapley [1962] Slide 48. Gale and L. S. Shapley, College admissions and the stability of Marriage, American Mathematical onthly, 69:9 15, 1962. ssign each person to be free; hile some man m is free do egin w := first woman on m s list to whom m has not yet proposed; if w is free then assign m and w to be engaged (to each other) else if w prefers m to her fiancé m then assign m and w to be engaged and m to be free else w rejects m (and m remains free) nd:. Gusfield, R. W. Irving, The Stable Marriage Problem Structure and Algorithms, MIT Press, 1989.)