<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Helton Duarte &#187; Cursos / Dicas / Tutoriais</title>
	<atom:link href="http://heltonduarte.com/category/cursos/feed/" rel="self" type="application/rss+xml" />
	<link>http://heltonduarte.com</link>
	<description>O seu espaço sobre programação</description>
	<lastBuildDate>Fri, 15 Jul 2011 18:38:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>North America &#8211; Mid-Atlantic Regional 2010</title>
		<link>http://heltonduarte.com/2011/07/15/north-america-mid-atlantic-regional-2010/</link>
		<comments>http://heltonduarte.com/2011/07/15/north-america-mid-atlantic-regional-2010/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 18:38:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Treinamento Maratona - UFRN]]></category>
		<category><![CDATA[ACM ICPC Live Archive]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Maratona de Programação]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Mid-Atlantic 2010]]></category>
		<category><![CDATA[Programação Dinâmica]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=398</guid>
		<description><![CDATA[Olá pessoal!

Precisamos seguir nossos sonhos segundo a vontade de Deus! Apesar de estarmos com um comparecimento muito baixo (média de 2,5 pessoas por competição), nós não desistiremos, pois não podemos fazer pelos outros, mas também ninguém fará por nós, ou seja, cada um tem consciência do que precisa treinar caso queira algum dia ter um resultado melhor nessas competições. Novamente, fizemos uma prova em equipe, comparecendo somente 2 componentes da Absurdo Clássico e nada mais.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Precisamos <strong>seguir nossos sonhos </strong>segundo a <strong>vontade de Deus!</strong> Apesar de estarmos com um comparecimento muito baixo (média de 2,5 pessoas por competição), nós não desistiremos, pois não podemos fazer pelos outros, mas também ninguém fará por nós, ou seja, cada um tem <strong>consciência do que precisa treinar</strong> caso queira algum dia ter um resultado melhor nessas competições. Novamente, fizemos uma <strong>prova em equipe</strong>, comparecendo somente 2 componentes da <strong>Absurdo Clássico</strong> e nada mais.</p>
<h3>Mid-Atlantic Regional 2010</h3>
<p><a href="http://heltonduarte.com/wp-content/uploads/2011/07/icpclogo_big.png"><img class="alignright size-medium wp-image-399" title="ACM ICPC" src="http://heltonduarte.com/wp-content/uploads/2011/07/icpclogo_big-300x189.png" alt="" width="300" height="189" /></a>Como já foi dito aqui, <a title="North America Regional Contests" href="http://cm.baylor.edu/public/worldMap/worldMap.icpc?contestId=870&amp;cid=62266" target="_blank">as provas da América do Norte</a> são muito boas para quem está começando a treinar, pois possuem um nível intermediário, ou seja, simula aproximadamente <strong>a primeira fase </strong>da <a title="Maratona de Programação" href="http://maratona.ime.usp.br" target="_blank">Maratona de Programação</a> aqui no Brasil. <a title="Mid-Atlantic Regional 2010" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403" target="_blank">Essa prova</a> possuía <strong>8 questões</strong> e nosso desempenho foi um pouquinho melhor do que a passada, pois conseguimos resolver 4 questões em tempo de prova e mais 1 depois, totalizando <strong>5/8 (cinco oitavos) da prova analisados</strong> para vocês.</p>
<ul>
<li>
<h4>Problem A: Palindrometer</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4868. <strong>Link:</strong> <a title="Palindrometer" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2869" target="_blank">Palindrometer.</a> <strong>Dificuldade (0 a 10):</strong> 2. <strong>Assunto:</strong> Matemática Básica.</p>
<p>Esse problema foi um dos mais fáceis da prova, senão o mais fácil. Ele consistia em encontrar qual era o<strong> menor palíndromo maior ou igual do que um número dado.</strong> Esse tarefa parece ser bem simples logo de cara, contudo <strong>pode se tornar traiçoeira</strong> caso você queira ir incrementando o número de 1 em 1 e verificando se ele tornou-se palíndromo, afinal temos limite de <strong>N &lt; 10^10</strong> e essa solução lhe daria um belo Time Limit Exceeded. Todavia, não se desespere! Que tal você seguir a ideia de <strong>gerar todos os palíndromos de antemão</strong> e depois só percorrer a lista e ver qual é o primeiro encontrado maior ou igual ao N dado? Como os números só podem ir até 9 dígitos, então um for simples até 10^4 geraria todos os palíndromos necessários (com casos especiais para uma quantidade ímpar de dígitos). Gostou da explicação? Mande suas dicas e dúvidas!</p>
<ul>
<li>
<h4>Problem B: Balloons</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4863. <strong>Link:</strong> <a title="Balloons" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2864" target="_blank">Balloons.</a> <strong>Dificuldade (0 a 10):</strong> 3. <strong>Assunto:</strong> Guloso.</p>
<p>Agora chegamos no segundo mais fácil. Um <strong>problema de otimização</strong>, ou seja, devemos procurar qual o menor valor que satisfaz determinada condição (muito comum em competições de programação). Nesse caso, ele gostaria de saber qual a menor distância a ser percorrida para entregar os balões em uma competição dada a necessidade de cada time e a distância para cada uma das salas (eram 2). Logo de cara, percebe-se que <strong>a ideia é gulosa</strong>, no entanto podemos cair na armadilha de pensar que o que deve ser observado é a menor distância para as salas, ou seja, <strong>ordenar os times</strong> pelo mínimo entre a distância para a sala A e a distância para a sala B. Pense em um contra-exemplo para essa ideia! <strong>Quase desistíamos</strong> de fazer o problema quando vimos que essa ideia falhava, mas percebemos que ainda era guloso, contudo deveríamos <strong>ordenar pela diferença entre as distância para as salas,</strong> ou seja, entrega primeiro para as equipes que possuem uma maior diferença entre as distâncias. Deu para entender ou a ideia ficou confusa? Leia mais sobre algoritmos gulosos e dê também a sua dica!</p>
<ul>
<li>
<h4>Problem C: Selling Cells</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4916. <strong>Link:</strong> <a title="Selling Cells" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2917" target="_blank">Selling Cells</a>.  <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> Geometria.</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, nos envie um comentário.</p>
<ul>
<li>
<h4>Problem D: Not One Bit More</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4864. <strong>Link:</strong> <a title="Not One Bit More" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2865" target="_blank">Not One Bit More</a>.   <strong>Dificuldade (0 a 10):</strong> 5. <strong>Assunto:</strong> Matemática, Representação Binária.</p>
<p>Acredito que esse foi <strong>o problema que fiquei mais feliz</strong> em ter conseguido fazer! Graças a Deus, a ideia foi vindo de pouco em pouco (estávamos eu e Zailton fazendo juntos) e no final tínhamos uma bela resolução. Logo de cara, eu tenho medo de problemas que colocam limites muito altos, como o <strong>10^18</strong> que ele coloca, no entanto dá para perceber que esses limites são realmente para assustar. Como ele conta a quantidade de bits acesos, então <strong>em 1 passo o número estaria em, no máximo, 64,</strong> pois 10^18 &lt; 2^64. Nesse caso, calculamos a função dada no problema para todos os valores até 64 e, depois fazíamos um for, chamando a nossa função para cada número que tivesse K = X &#8211; 1, sendo X o valor passado, pois iríamos calcular os números que em 1 passo chegaria no nosso teste (confuso né?). Nessa nossa função principal (que fazia praticamente todo o cálculo do problema) nós <strong>contávamos quantos números menores do que nosso parâmetro possuíam exatamente N bits acesos</strong> e deixamos como exercício para você pensar. Para cada chamada, a quantidade de números entre LO e HI com N bits acesos seria <strong>f(HI + 1) &#8211; f(LO),</strong> tratando apenas os casos em que aparece o número 1 na contagem&#8230; Será que você também consegue fazer? Tente e depois nos passe suas dúvidas e dicas!</p>
<ul>
<li>
<h4>Problem E: Abstract Extract</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4917. <strong>Link:</strong> <a title="Abstract Extract" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2918" target="_blank">Abstract Extract</a>.<a title="Not One Bit More" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2865" target="_blank"></a> <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, nos envie um comentário.</p>
<ul>
<li>
<h4>Problem F: Roller Coaster</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4870. <strong>Link:</strong> <a title="Roller Coaster" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2871" target="_blank">Roller Coaster</a>.   <strong>Dificuldade (0 a 10):</strong> 5. <strong>Assunto:</strong> Programação Dinâmica.</p>
<p>Bem, e esse foi o problema que só conseguimos fazer depois de a competição ter terminado. Na verdade, fiz somente um pouco antes de escrever esse post. Ele é um problema bem interessante e <strong>essencial para quem quer se dar bem em competições </strong>e aprender algoritmo em si, pois envolve a técnica de <a title="Programação Dinâmica" href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_din%C3%A2mica" target="_blank">Programação Dinâmica (PD)</a>, a qual não é trivial de se dominar. De início, havia pensado em uma PD <strong>sobre a seção e o enjôo</strong> (dizziness), maximizando a diversão que se conseguia, contudo vi que <strong>o limite de enjôo era 300.000,</strong> enquanto que o de diversão, embora não explicitado na questão, é calculado facilmente como sendo 20.000. Dessa forma, <strong>a PD mais tranquila</strong> para se fazer, na minha opinião, seria <strong>sobre a seção e a diversão alcançada, minimizando o enjôo,</strong> ou seja, teríamos uma &#8220;recursão&#8221; (mas na verdade é preciso fazer essa <strong>PD bottom-up,</strong> pois não há como armazenar a tabela como um todo, devendo armazenar apenas 2 linhas) em que <strong>d(i, j) seria o menor enjôo que poderia se conseguir ao chegar na seção &#8220;i&#8221; com uma diversão total de &#8220;j&#8221;</strong>, deu para entender? Pense um pouquinho em como implementar essa ideia de forma rápida e, qualquer coisa, mande-nos suas dúvidas!</p>
<ul>
<li>
<h4>Problem G: Spy Cam</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4918. <strong>Link:</strong> <a title="Spy Cam" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2919" target="_blank">Spy Cam</a>.   <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, nos envie um comentário.</p>
<ul>
<li>
<h4>Problem H: Underground Cables</h4>
</li>
</ul>
<p><strong>LA ID:</strong> 4872. <strong>Link:</strong> <a title="Underground Cables" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=403&amp;page=show_problem&amp;problem=2873" target="_blank">Underground Cables</a>.   <strong>Dificuldade (0 a 10):</strong> 3. <strong>Assunto:</strong> Grafos, Árvore Geradora Mínima.</p>
<p>Quando comecei a ler esse problema me animei, pois percebi logo que era uma clássica <a title="Árvore Geradora Mínima" href="http://pt.wikipedia.org/wiki/%C3%81rvore_de_extens%C3%A3o_m%C3%ADnimahttp://pt.wikipedia.org/wiki/%C3%81rvore_de_extens%C3%A3o_m%C3%ADnima" target="_blank">Árvore Geradora Mínima</a>, todavia li um pouco depois &#8220;os cabos não podem se cruzar&#8221; e pensei: minha ideia foi por água abaixo! <strong>Como adaptar o algoritmo de MST</strong> para que não haja cruzamento de arestas? Simples: <strong>não precisa fazer nada!</strong> É possível ver intuitivamente (não tentei provar) que se houver um cruzamento, então haveria outra forma melhor de ter ligado essas arestas, já que o grafo aqui é um grid cartesiano. Portanto, esse problema é muito simples<strong> ao ser reduzido para um caso clássico de grafos.</strong> Não entendeu a explicação? Mande-nos sua dúvida!</p>
<p>Nessa competição, já pudemos utilizar o <strong>BOCA</strong> para simular o ambiente da <a title="Maratona de Programação" href="http://maratona.ime.usp.br" target="_blank">Maratona de Programação</a> e foi um sucesso! A partir de agora, tentaremos sempre utilizar o sistema, a fim de testarmos seu uso e nos acostumarmos mais com a situação. Espero que vocês <strong>tentem fazer a prova </strong>e obtenham um bom resultado!</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="North America - East Central Regional 2010" href="http://heltonduarte.com/2011/07/09/north-america-east-central-regional-2010/">North America &#8211; East Central Regional 2010</a></li>
<li><a title="Waterloo Contest 2009 - Fall 2" href="http://heltonduarte.com/2011/06/29/waterloo-contest-2009-fall-2/">Waterloo Contest 2009 &#8211; Fall 2</a></li>
<li><a title="Computação e Matemática" href="http://heltonduarte.com/2011/02/15/computacao-e-matematica/">Computação e Matemática</a></li>
<li><a title="Não é apenas o emprego dos sonhos!" href="http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/">Não é apenas o emprego dos sonhos!</a></li>
<li><a title="Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/">Programando Melhor</a></li>
</ul>
<p><em>E você, tentou fazer a prova do Mid-Atlantic Regional 2010? Conseguiu fazer todas essas questões? Fez alguma das que não conseguimos? Deixe como comentário as suas dúvidas e as suas dicas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Purificando a vossa alma na obediência à verdade, para amor fraternal, não fingido, amai-vos ardentemente uns aos outros, com um coração puro&#8221;</em> <strong>1 Pe 1.22</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2011/07/15/north-america-mid-atlantic-regional-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>North America &#8211; East Central Regional 2010</title>
		<link>http://heltonduarte.com/2011/07/09/north-america-east-central-regional-2010/</link>
		<comments>http://heltonduarte.com/2011/07/09/north-america-east-central-regional-2010/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 15:11:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Treinamento Maratona - UFRN]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[East Central NA Regional]]></category>
		<category><![CDATA[Maratona de Programação]]></category>
		<category><![CDATA[UFRN]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=395</guid>
		<description><![CDATA[Olá pessoal,

Venho aqui para falar da nossa segunda competição de treinamento para a Maratona de Programação. Novamente, compareceram somente os componentes das equipes "Absurdo Clássico" e "Score Limit Exceeded", da UFRN, apesar de saber que ainda existem alguns que querem mas não estão podendo comparecer. Como já foi dito, quem não pôde ir, tire  5 horas em algum local com sua equipe reunida e tente refazer essa prova, pois irá trazer muito mais conhecimento para vocês.]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>Venho aqui para falar da nossa segunda competição de <strong>treinamento</strong> para a <a title="Maratona de Programação" href="http://maratona.ime.usp.br/" target="_blank">Maratona de Programação</a>. Novamente, compareceram somente os componentes das equipes <strong>&#8220;Absurdo Clássico&#8221;</strong> e <strong>&#8220;Score Limit Exceeded&#8221;</strong>, da UFRN, apesar de saber que ainda existem alguns que querem mas não estão podendo comparecer. Como já foi dito, quem não pôde ir, <strong>tire  5 horas em algum local com sua equipe</strong> reunida e tente refazer essa prova, pois irá trazer muito mais conhecimento para vocês.</p>
<h3>East Central Regional 2010</h3>
<p>Bem, as provas das <strong>regionais dos Estados Unidos e Canadá</strong> são sempre de um enorme proveito para treinamento, pois consistem de problemas com <strong>dificuldade interessante,</strong> porém não dos mais difíceis, sendo ideal para equipes que estão começando um treinamento mais pesado, como as nossas equipes da UFRN. <a title="East Central Regional 2010" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401" target="_blank">Essa prova</a> possuiu <strong>8 questões</strong> e nós a fizemos <strong>em equipe</strong> (na verdade, foram equipes de 2 pessoas, pois só compareceram 4 dessa vez e ainda 2 tiveram que sair mais cedo), <strong>conseguindo resolver, ao final, 4 problemas</strong>, sendo 3 na hora mesmo da competição e 1 depois do término do tempo. Vejamos como eles são!</p>
<ul>
<li>Problema A: Cut it out!</li>
</ul>
<p><strong>LA ID:</strong> 4900. <strong>Link:</strong> <a title="Cut it out!" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2901" target="_blank">Cut it out!</a> <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, mande um comentário!</p>
<ul>
<li>Problema B: Flip it!</li>
</ul>
<p><strong>LA ID:</strong> 4901. <strong>Link:</strong> <a title="Flip it!" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2902" target="_blank">Flip it!</a> <strong>Dificuldade (0 a 10):</strong> 3 <strong>Assunto:</strong> Pilhas, Simulação</p>
<p>Esse problema era o segundo mais fácil da prova, acredito eu, pois envolvia somente a manipulação de um <strong>tabuleiro de pilhas.</strong> É um problema simples de simulação, o qual tem como dificuldade somente o fato de ter que manter cada quadrado do grid como uma pilha, a fim de facilitar as operações descritas no enunciado. Outro <strong>cuidado</strong> que deve-se tomar é <strong>na leitura da linha de operações,</strong> a qual é uma string, mas antes foi feita leitura de inteiros, portanto deve fazer um getline() antes, apenas para pegar o &#8216;\n&#8217; que ainda está no buffer. Mais informações sobre essa <strong>limpeza necessária no buffer</strong> pode ser encontrado no <a title="Common Mistakes in Online and Real-time Contests" href="http://rippedpants.wordpress.com/2009/12/16/common-mistakes-in-online-and-real-time-contests/" target="_blank">texto do Shahriar Manzoor</a>. Deu para entender a explicação? Qualquer dúvida, mande um comentário!</p>
<ul>
<li>Problema C: Maze</li>
</ul>
<p><strong>LA ID:</strong> 4902. <strong>Link:</strong> <a title="Maze" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2903" target="_blank">Maze</a>. <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, mande um comentário!</p>
<ul>
<li>Problema D: Photo Shoot</li>
</ul>
<p><strong>LA ID:</strong> 4903. <strong>Link:</strong> <a title="Photo Shoot" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2904" target="_blank">Photo Shoot</a>.  <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, mande um comentário!</p>
<ul>
<li>Problema E: Polar Bear</li>
</ul>
<p><strong>LA ID:</strong> 4904. <strong>Link:</strong> <a title="Polar Bear" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2905" target="_blank">Polar Bear</a>.  <strong>Dificuldade (0 a 10):</strong> 3 <strong>Assunto:</strong> Grids</p>
<p>Esse problema é de Grids e, aparentemente, bem complexo. Logo que você abre o problema, <strong>tem medo do grid circular </strong>que aparece, com uma divisões estranhas, contudo esse tipo de grid é para ser tratado <strong>praticamente igual a um grid quadrado,</strong> o qual nós estamos mais acostumados a lidar. Não entendeu? Se você prestar atenção, vê que cada célula (sem contar as centrais e as de borda) possuem exatamente 8 vizinhos, como em um grid quadrado, mudando somente o fato de que é circular, ou seja, <strong>a última &#8220;coluna&#8221; é vizinha da primeira</strong>. Nesse caso, é só preciso <strong>tratar os casos especiais,</strong> que são descritos no próprio enunciado! Depois de montar o grid, é só fazer a simulação de um <a title="Jogo da Vida" href="http://pt.wikipedia.org/wiki/Jogo_da_vida" target="_blank">Jogo da Vida,</a> assim como nós aprendemos a fazer em OCaml, no 1º semestre do curso (para o pessoal que entrou até 2010, como o meu caso). Alguma dúvida na minha explicação? Mande um comentário!</p>
<ul>
<li>Problema F: Pro-Test Voting</li>
</ul>
<p><strong>LA ID:</strong> 4905. <strong>Link:</strong> <a title="Pro-Test Voting" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2906" target="_blank">Pro-Test Voting</a><a title="Photo Shoot" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2904" target="_blank"></a>.  <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, mande um comentário!</p>
<ul>
<li>Problema G: Vampires!</li>
</ul>
<p><strong>LA ID:</strong> 4906. <strong>Link:</strong> <a title="Vampires!" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2907" target="_blank">Vampires!</a>.  <strong>Dificuldade (0 a 10):</strong> 2 <strong>Assunto:</strong> Grids</p>
<p>Esse é o problema mais fácil do contest, envolvendo um <strong>grid simples</strong> (quadrado) e alguma ideia de como percorrê-lo. Acredito que a única confusão que pode ser feita no problema é tentar partir de cada espelho para chegar nos vampiros e ir armazenando esses encontros nos espelhos, pois deixa a codificação mais complexa e a eficiência do algoritmo menor. A melhor abordagem, pelo menos na minha opinião, é a de<strong> partir de cada vampiro até os espelhos</strong> e verificar para quais direções ele teria problemas. Fácil, não? Se tiver dúvidas, nos mande comentários!</p>
<ul>
<li>Problema H: We&#8217;ve Got Chemistry, Babe</li>
</ul>
<p><strong>LA ID:</strong> 4907. <strong>Link:</strong> <a title="We've Got Chemistry, Babe" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=401&amp;page=show_problem&amp;problem=2908" target="_blank">We&#8217;ve Got Chemistry, Babe</a>.  <strong>Dificuldade (0 a 10):</strong> 7 <strong>Assunto:</strong> Sitemas lineares, Eliminação de Gauss-Jordan</p>
<p>Esse é certamente <strong>o problema mais trabalhoso da competição,</strong> tanto é que somente os 2 primeiros lugares da regional que conseguiram resolvê-lo. No entanto, como não estávamos com ideias para os demais problemas, partimos logo para o que a codificação seria mais demorada. A ideia inicial desse problema é conseguir entender como<strong> o balanceamento de uma equação química pode ser reduzido a resolução de um sistema linear</strong> e esse fato deve a tratar cada coeficiente a ser encontrado como uma variável e cada elemento como uma equação diferente. Além disso, como o problema pede somente os casos de balenceamento único, deve-se considerar somente as situações em que há apenas uma variável livre no sistema e também ignorar os casos em que são encontrados coeficientes não-positivos. Depois de toda essa ideia (e um código já bem extenso), esse problema <strong>ainda possui uma leitura de dados bem complexa e trabalhosa,</strong> fazendo com que o código cresça mais um bocadinho&#8230; Conseguiu fazer? Qualquer dúvida, pode nos perguntar!</p>
<p>E foi esse nosso segundo encontro de treinamento para a <a title="Maratona de Programação 2011" href="http://maratona.ime.usp.br">Maratona de Programação 2011</a>! Espero que tenham gostado dos comentários e nos vemos na próxima terça-feira, para mais uma competição! (lembrando que agora que o <strong>BOCA foi instalado nos servidores do LCC, graças a Edwyn,</strong> nossas competições poderão ficar ainda mais realísticas).</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Waterloo Contest 2009 - Fall 2" href="http://heltonduarte.com/2011/06/29/waterloo-contest-2009-fall-2/">Waterloo Contest 2009 &#8211; Fall 2</a></li>
<li><a title="Computação e Matemática" href="http://heltonduarte.com/2011/02/15/computacao-e-matematica/">Computação e Matemática</a></li>
<li><a title="Não é apenas o emprego dos sonhos" href="http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/">Não é apenas o emprego dos sonhos</a></li>
<li><a title="Segmentation Fault - a memória do PC pede ajuda!" href="http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/">Segmentation Fault &#8211; a memória do PC pede ajuda!</a></li>
<li><a title="Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/">Programando Melhor</a></li>
</ul>
<p><em>E você, fez a competição do East Central Regional 2010? Conseguiu fazer quais questões? Deixe seu comentário com algumas dicas ou dúvidas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Mas estende a tua mão, e toca-lhe em tudo quanto tem, e verás se não blasfema de ti na tua face! [...] Em tudo isto Já não pecou, nem atribuiu a Deus falta alguma.&#8221;</em> <strong>Jó 1.11,22</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2011/07/09/north-america-east-central-regional-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Waterloo Contest 2009 &#8211; Fall 2</title>
		<link>http://heltonduarte.com/2011/06/29/waterloo-contest-2009-fall-2/</link>
		<comments>http://heltonduarte.com/2011/06/29/waterloo-contest-2009-fall-2/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 20:06:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Treinamento Maratona - UFRN]]></category>
		<category><![CDATA[Maratona de Programação]]></category>
		<category><![CDATA[UFRN]]></category>
		<category><![CDATA[UVa Online Judge]]></category>
		<category><![CDATA[Waterloo Contests]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=390</guid>
		<description><![CDATA[Olá pessoal,

Eu venho aqui, depois de um tempo enorme, para anunciar uma série de posts que serão feitos aqui no blog, como parte do treinamento das equipes da UFRN para a Maratona de Programação 2011. Nosso treinamento consistirá de diversas reuniões no LCC para simular competições passadas dos mais variados locais do mundo, tanto individuais quanto em equipe e, sempre que possível, no mesmo dia à tarde eu irei fazer um post com algumas dicas para os problemas que conseguirmos fazer. Além das dicas, terá o nível de dificuldade (variando de 0 a 10) e o assunto abordado. O que vocês acharam da novidade?]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Eu venho aqui, depois de um tempo enorme, para anunciar uma série de posts que serão feitos aqui no blog, como parte do <strong>treinamento das equipes da UFRN</strong> para a <a title="Maratona de Programação 2011" href="http://maratona.ime.usp.br/" target="_blank">Maratona de Programação 2011</a>. Nosso treinamento consistirá de diversas reuniões no LCC para simular <strong>competições passadas </strong>dos mais variados locais do mundo, <strong>tanto individuais quanto em equipe</strong> e, sempre que possível, no mesmo dia à tarde eu irei fazer <strong>um post com algumas dicas para os problemas</strong> que conseguirmos fazer. Além das dicas, terá o <strong>nível de dificuldade</strong> (variando de 0 a 10) e o <strong>assunto abordado.</strong> O que vocês acharam da novidade?</p>
<p>Começaremos hoje, com uma competição que fizemos individualmente, que é o <a title="Waterloo Contest 2009 - Fall 2" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=13&amp;page=show_contest&amp;contest=238" target="_blank">Waterloo ACM Programming Contest 2009 &#8211; Fall 2</a>! Tivemos um comparecimento bem baixo, de apenas 5 pessoas (eu, Edwyn, Lucas, Zailton e Argus), esperando que esse número cresça, mas entendo que algumas pessoas gostariam de estar lá e não puderam, como os calouros de Cien Comp, que tinham aula no horário, além de Álvaro e Leon, que ainda estão em aulas no IFRN. <strong>Para vocês que queriam ir e não puderam</strong>, tirem 3 horas em casa mesmo e tentem fazer os problemas dessa competição, sem olhar as dicas abaixo; quando terminar o tempo, venha olhar ou dar alguma dica aqui no blog.</p>
<h3>Waterloo Contest 2009 &#8211; Fall 2</h3>
<p><a href="http://heltonduarte.com/wp-content/uploads/2011/06/UWaterloo-logo.gif"><img class="alignright size-full wp-image-391" title="UWaterloo-logo" src="http://heltonduarte.com/wp-content/uploads/2011/06/UWaterloo-logo.gif" alt="" width="135" height="93" /></a>Bem, as competições desenvolvidas pela <a title="University of Waterloo: School of Computer Science" href="http://www.cs.uwaterloo.ca/" target="_blank">Universidade de Waterloo, no Canadá</a>, sempre consistem de 5 problemas, para serem resolvido em 3 horas. Desse modo, sempre que formos refazer essas provas, nós iremos competir individualmente, para testar como está o empenho de cada um. Durante a nossa competição, <strong>cada competidor só conseguiu fazer o problema E</strong>, todavia logo que ela acabou nós nos reunimos para tentar <strong>entender a solução do problema C</strong>. No final, quando cheguei em casa, pensando mais um bocadinho, <strong>consegui ter uma ideia para o problema A.</strong> Curtam as dicas:</p>
<ul>
<li>
<h4>Problem A: Rooks</h4>
</li>
</ul>
<p><strong>UVa ID:</strong> 11699. <strong>Link:</strong> <a title="Problem A: Rooks" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=78&amp;page=show_problem&amp;problem=2746" target="_blank">Rooks</a>. <strong>Dificuldade (0 a 10):</strong> 5. <strong>Assunto:</strong> Bitmasks.</p>
<p>Uma ideia interessante para o problema é perceber que com 15 torres você com certeza pode ter todos os quadrados do tabuleiro ocupados, pois <strong>você precisa no máximo de uma torre por linha.</strong> Dessa forma, podemos testar todos os possíveis subconjuntos das linhas, pois é um total de 32768. Para ver os subconjuntos, pensamos neles como os números de 0 a 32767, pois temos 15 bits &#8220;acesos&#8221; ou &#8220;apagados&#8221;, os quais representarão as linhas com ou sem torres. Para cada subconjunto, percorre-se somente <strong>as linhas que não possuem torres e verifica-se quantas colunas existem com hashes.</strong> Caso o número de colunas seja menor do que ou igual ao de torres, então pode-se colocar uma torre em cada uma dessas colunas (nas linhas &#8220;acesas&#8221;) e atacar todos os quadrados necessários. Deu para entender? Qualquer dúvida, mande um comentário!</p>
<ul>
<li>
<h4>Problem B: Pipes</h4>
</li>
</ul>
<p><strong>UVa ID:</strong> 11700. <strong>Link:</strong> <a title="Problem B: Pipes" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=117&amp;page=show_problem&amp;problem=2747" target="_blank">Pipes</a>. <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, mande um comentário!</p>
<ul>
<li>
<h4>Problem C: Cantor</h4>
</li>
</ul>
<p><strong>UVa ID:</strong> 11701. <strong>Link:</strong> <a title="Problem C: Cantor" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=117&amp;page=show_problem&amp;problem=2748" target="_blank">Cantor</a>. <strong>Dificuldade (0 a 10):</strong> 4. <strong>Assunto:</strong> Sistemas numéricos.</p>
<p>O problema parece simples à primeira vista. Depois de levar o primeiro Wrong Answer, você pensa que ele está errado. Depois descobre que era besteira! Em problemas em que limita-se o número de casas decimais do número para algo baixo (como 6 nesse exemplo), normalmente <strong>é muito mais fácil você trabalhar com o número como inteiro,</strong> ao multiplicar pela potência de 10 adequada. A ideia é pré-calcular todos os membros e depois fazer somente uma consulta em um vetor. Primeiramente, deve-se calcular os números que <strong>no primeiro passo para transformar ele em base 3, já gera um dígito 1.</strong> Coloque esses números em uma fila. Além disso, você deve ter uma lista &#8220;reversa&#8221; para cada número N, indicando de quais números você chegará em N com 1 passo da mudança de base. Assim você marcará cada elemento colocado na fila como NON-MEMBER, e <strong>enfileirará aqueles que estão na lista &#8220;reversa&#8221; dele </strong>mas ainda não foram marcados. Deu para entender? Qualquer dúvida, mande um comentário!</p>
<ul>
<li>
<h4>Problem D: Meltdown</h4>
</li>
</ul>
<p><strong>UVa ID:</strong> 11702. <strong>Link:</strong> <a title="Problem D: Meltdown" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=117&amp;page=show_problem&amp;problem=2749" target="_blank">Meltdown</a>. <strong>Dificuldade (0 a 10):</strong> ? <strong>Assunto:</strong> ?</p>
<p>Não conseguimos fazer esse problema. Qualquer dica, mande um comentário!</p>
<ul>
<li>
<h4>Problem E: sqrt log sin</h4>
</li>
</ul>
<p><strong>UVa ID:</strong> 11703. <strong>Link:</strong> <a title="Problem E: sqrt log sin" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=117&amp;page=show_problem&amp;problem=2750" target="_blank">sqrt log sin</a>. <strong>Dificuldade (0 a 10):</strong> 2. <strong>Assunto:</strong> Recursão + Memoization.</p>
<p>Esse problema é o mais fácil do contest. E é realmente fácil. Nele, só é preciso <strong>implementar a recursão exatamente como é descrito</strong> no enunciado, sem alterações, e <strong>utilizar um memoization,</strong> ou seja, ter um vetor que irá armazenar o valor de Xi para cada 0 &lt;= i &lt;= 1000000, assim que ele for calculado a primeira vez, para que não haja cálculo repetido. Deu para entender? Qualquer dúvida, mande um comentário!</p>
<p>É isso aí, pessoal! Esse foi nosso primeiro treino para a <a title="Maratona de Programação 2011" href="http://maratona.ime.usp.br/" target="_blank">Maratona de Programação 2011</a> e espero que eu possa ter ajudado vocês com essas dicas!</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Computação e Matemática" href="http://heltonduarte.com/2011/02/15/computacao-e-matematica/" target="_self">Computação e Matemática</a></li>
<li><a title="Não é apenas o emprego dos sonhos" href="http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/" target="_self">Não é apenas o emprego dos sonhos</a></li>
<li><a title="Segmentation Fault - a memória do PC pede ajuda!" href="http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/" target="_self">Segmentation Fault &#8211; a memória do PC pede ajuda!</a></li>
<li><a title="Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/" target="_self">Programando Melhor</a></li>
</ul>
<p><em>E você, como foi no Waterloo Contest 2009 &#8211; Fall 2? Gostou das dicas ou estavam meio confusas? Conseguiu resolver qual(is) problema(s)? Faça seu comentário e deixe sua opinião!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;E disse o SENHOR a Satanás: Observaste tu a meu servo Jó? Porque ninguém há na terra semelhante a ele, homem sincero, e reto, e temente a Deus, e desviando-se do mal.&#8221;</em> <strong>Jó 1.8</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2011/06/29/waterloo-contest-2009-fall-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Segmentation Fault &#8211; a memória do PC pede ajuda!</title>
		<link>http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/</link>
		<comments>http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 15:26:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Treinamento OBI/IOI]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[segmentation fault]]></category>
		<category><![CDATA[USACO Training Program]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=344</guid>
		<description><![CDATA[Explicação sobre "Segmentation Fault", assim como as causas mais prováveis de gerar esse tipo de erro. Ajuda para a OBI / IOI com mais uma dica para você!]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Venho treinando nos últimos dias com o foco na <a title="OBI 2010" href="http://olimpiada.ic.unicamp.br" target="_blank">OBI 2010</a> e, quem sabe, na <a title="IOI 2010" href="http://www.ioi2010.org" target="_blank">IOI 2010</a> (se Deus quiser!), no site de treinamento da equipe dos Estados Unidos, mais conhecido como <a title="USACO Training Program" href="http://ace.delos.com/usacogate" target="_blank">USACO Training Program</a> e percebi que é uma <strong>fonte impressionante de treinamento para competições de programação</strong>, especialmente as citadas acima. Durante algumas resoluções de problemas me deparei com um erro chamado <strong>&#8220;Segmentation Fault&#8221;</strong> quando eu tentava executar o programa e resolvi pesquisar a respeito para esclarecer melhor na minha mente e poder passar a todos, já que não é um erro tão raro de ocorrer em programas.</p>
<p>Quando se tem um <strong>irmão expert em C++</strong> e amante de competições de programação assim como eu tenho, é bem mais fácil tirar as dúvidas, portanto segue a explicação (adaptada) que <strong>Herbert Duarte</strong> deu para esse problema.</p>
<p><strong>Segfault</strong>, como também é conhecido, ocorre quando um programa está tentando <strong>acessar uma área de memória protegida</strong>, ou seja, que não faz parte de seu endereçamento (espaço da memória revervado pelo Sistema Operacional para cada um dos programas que estão sendo executados), ou quando <strong>tenta acessar um local de forma inapropriada</strong>, como por exemplo, tentando escrever em um espaço que é de somente-leitura. As <strong>causas mais comuns</strong> para esse tipo de erro são as seguintes:</p>
<ul>
<li><strong>Ponteiros não inicializados ou com valores inválidos</strong>, pois quando o programa tenta acessá-lo provavelmente irá cair em algum lugar aleatório da memória que o programa não tem acesso;</li>
<li><strong>Acessar uma posição inválida de matrizes ou vetores</strong>, já que o programa irá calcular a posição como se ela existisse e provavelmente irá cair em um local sem acesso (ocorrendo frequentemente quando o programa calcula, em alguma situação, uma posição para ser acessada, porque, se houver qualquer erro nesse cálculo, a posição acessada será inválida);</li>
<li>Tentar alterar um caracter de uma string que foi inicializada como &#8220;Somente leitura&#8221;.</li>
</ul>
<p>Bem, dessa forma, espero que cuidem melhor de seus programas para não caírem nesse mesmo erro, lembrando apenas que <strong>Segmentation Fault não é um erro de compilação de código</strong>, mas um erro de execução de programa.</p>
<p><strong>Fonte para auxílio:</strong> <a title="Segmentation Fault - Wikipedia" href="http://en.wikipedia.org/wiki/Segmentation_fault" target="_blank">Segmentation Fault &#8211; Wikipedia</a></p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Treinando para a OAH 2009" href="http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/" target="_self">Treinando para a OAH 2009</a></li>
<li><a title="Google Code Jam 2009: uma nova oportunidade" href="http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/" target="_self">Google Code Jam 2009: uma nova oportunidade</a></li>
<li><a title="Categoria: Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/" target="_self">Categoria: Programando Melhor</a></li>
</ul>
<p><em>Mais algum erro está perturbando vocês? <strong>Comente</strong> e nos conte que procuraremos sempre ajudá-lo!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Eu, porém, estou aflito e necessitado; apressa-te por mim, ó Deus; tu és o meu auxílio e o meu libertador; SENHOR, não te detenhas.&#8221;</em> <strong>Salmos 70.5</strong></p>
<p><em>&#8220;Por ti tenho sido sustentado desde o ventre; tu és aquele que me tiraste do ventre de minha mãe; o meu louvor será para ti constantemente.&#8221; </em><strong>Salmos 71.6</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Treinando para a OAH 2009</title>
		<link>http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/</link>
		<comments>http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 20:57:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cursos / Dicas / Tutoriais]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Hostnet]]></category>
		<category><![CDATA[OAH]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UVa Online Judge]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=299</guid>
		<description><![CDATA[Bem, pessoal, como alguns já devem saber, próxima sexta-feira acontece em todo o Brasil a primeira fase da III Olimpíada de Algoritmo Hostnet e estarei participando mais um ano, em busca do bicampeonato =D. A fim de treinarmos para essa competição, resolvi fazer esse post, dando umas dicas e um exercício, como exemplo, para vocês tentarem fazer.]]></description>
			<content:encoded><![CDATA[<p>Estamos aqui de novo!</p>
<p>Bem, pessoal, como alguns já devem saber, próxima sexta-feira acontece em todo o Brasil a <strong>primeira fase</strong> da <a title="III Olimpíada de Algoritmo Hostnet" href="http://www.oah.com.br" target="_blank">III Olimpíada de Algoritmo Hostnet</a> e estarei participando mais um ano, em busca do bicampeonato =D. A fim de treinarmos para essa competição, resolvi fazer esse post, dando umas <strong>dicas e um exercício</strong>, como exemplo, para vocês tentarem fazer. <strong>OBS:</strong> <em>Quem quiser saber se resolveu corretamente, faça um comentário dizendo isso que entrarei em contato por e-mail, ok?</em></p>
<h2>Dicas</h2>
<p>Tirando como base as <a title="Maratona de Programação - Dicas" href="http://maratona.ime.usp.br/dicas08.html" target="_blank">dicas do site da Maratona de Programação</a> e o <a title="Common Mistakes in Online and Real-time Contests" href="http://www.acm.org/crossroads/xrds7-5/contests.html" target="_blank">artigo do Shariar Manzoor na revista Crossroads</a>, pensei em umas dicas básicas:</p>
<ul>
<li>Não há nada pior do que gastar muito tempo fazendo e passando a limpo um     algoritmo para, depois, descobrir que ele está errado. Na OAH, esse     erro é fatal, já que o tempo é sempre um grande adversário. Por isso, apesar de a pressa ser necessária, procure sempre     certificar-se da corretude do algoritmo ANTES de escrevê-lo!</li>
<li>A escolha de seu time é essencial. Um bom time de programação precisa que cada componente tenha um conhecimento de algoritmos básicos (ordenação, encontrar n-ésimo número primo, calcular MDC/MMC, etc.), além da capacidade de criar novos para situações diversas.</li>
<li>Ao treinar, certifique-se de que cada membro do time sabe fazer o básico, como escrever procedimentos e fazer &#8220;debug&#8221; de um algoritmo. Um time bem-sucedido terá membros com algumas especialidades, como aquele que resolve problemas com busca, ou aquele bom em matemática, ou aquele que encontra erros facilmente. Todos os membros devem saber as qualidades e defeitos dos outros para saber quem ficará responsável por cada questão.</li>
<li>Todos devem estar aptos para realizar <a title="Obie Fernandez: 10 Reasons Pair Programming Is Not For the Masses" href="http://blog.obiefernandez.com/content/2009/09/10-reasons-pair-programming-is-not-for-the-masses.html" target="_blank">Pair-Programming</a>, ou seja, resolver uma das questões juntamente com outro membro, principalmente as mais difíceis. Não aconselho que fiquem os 3 membros pensando sobre o mesmo problema, a não ser em casos extremos.</li>
<li>Faça treinos de simulação, pois é a melhor forma de fazer a prova em um bom tempo. Treinar nas mesmas condições da competição é uma ótima dica, ou seja, fazer uma prova passada com o tempo cronometrado e depois pedir para um professor da instituição corrigí-la.</li>
<li>Faça muitas questões daqui para sexta-feira!</li>
</ul>
<h2>Exercício</h2>
<h3><strong>Coleta de Lixo Ecológica</strong> (traduzido e adaptado de <a title="UVa - Ecological Bin Packing" href="http://online-judge.uva.es/p/v1/102.html" target="_blank">&#8220;Ecological Bin Packing&#8221;, do UVa Online Judge</a>)</h3>
<p><strong>O Problema</strong></p>
<p>Reciclar vidro requer que ele seja separado por cor em uma das três categorias: vidro marrom, vidro verde e vidro transparente. Nesse problema você terá 3 latas de lixo, cada uma contendo um número específico de garrafas marrom, verde e transparente. No intuito de serem recicladas, as garrafas terão de ser movidas a fim de cada lata de lixo conter apenas garrafas de uma cor.</p>
<p>O problema é minimizar o número de garrafas que serão movidas. Você deve assumir que o único problema é minimizar o número de movimentos entre os cestos de lixo. Para a proposta desse problema, cada lixo tem a capacidade de armazenar infinitas garrafas e a única restrição é movê-las para cada cesto conter garrafas de uma única cor.</p>
<p><strong>A Entrada</strong></p>
<p>A entrada que seu programa irá ler consiste em uma linha contendo nove inteiros. Os primeiros três inteiros representam o número de garrafas marrons, verdes e transparentes (respectivamente) na lata 1, os segundos três inteiros representam o número de garrafas marrons, verdes e transparentes (respectivamente) na lata 2, os últimos três inteiros representam o número de garrafas marrons, verdes e transparentes (respectivamente) na lata 3. Por exemplo, a linha 10 15 20 30 12 8 15 8 31, indica que há 20 garrafas transparentes na lata 1, 12 garrafas verdes na lata 2 e 15 marrons na lata 3.</p>
<p><strong>A Saída</strong></p>
<p>A saída indicará as garrafas de que cores que estarão em cada lata para minimizar o número de movimentos. Você também deve escrever o número mínimo de movimentos com as garrafas para que isso ocorra.</p>
<p>O programa deverá escrever uma string com três letras maiúsculas &#8216;M&#8217;, &#8216;V&#8217; e &#8216;T&#8217; (representando as cores marrom, verde e transparente) representando a cor associada a cada lata de lixo.</p>
<p>O primeiro caracter representa a cor relacionada com a primeira lata, o segundo caracter representa a cor relacionada com a segunda lata e o terceiro caracter representa a cor relacionada com a terceira lata. Além disso, o inteiro representando o menor número de movimentos a serem feitos deverá vir seguido da string, separados com um espaço.</p>
<p>Se mais de uma ordem de latas marrom, verde e transparente produzir o número mínimo de movimentos, então a string que vier primeiro alfabeticamente deverá ser escrita.</p>
<p><strong>Exemplo de Entrada 1</strong></p>
<p>1 2 3 4 5 6 7 8 9</p>
<p><strong>Exemplo de Saída 1</strong></p>
<p>MTV 30</p>
<p><strong>Exemplo de Entrada 2</strong></p>
<p>5 10 5 20 10 5 10 20 10</p>
<p><strong>Exemplo de Saída 2</strong></p>
<p>TMV 50</p>
<p>Com isso, <strong>nossas dicas para a OAH 2009</strong> estão dadas, então eu desejo a todos os competidores, desde já, <strong>boa sorte</strong>! Mostrem a todos que vocês são capazes, mas não esqueçam, Deus é o único responsável por qualquer conquista sua.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Categoria: Cursos - Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/" target="_self">Categoria: Cursos &#8211; Programando Melhor</a></li>
<li><a title="Google Code Jam 2009: uma nova oportunidade" href="http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/" target="_self">Google Code Jam 2009: uma nova oportunidade</a></li>
<li><a title="Top Coder Marathon Matches" href="http://heltonduarte.com/2009/01/14/top-coder-marathon-matches/" target="_self">Top Coder Marathon Matches</a></li>
<li><a title="OAH 2008" href="http://heltonduarte.com/2008/11/24/oah-2008/" target="_self">OAH 2008</a></li>
</ul>
<p><em>Vamos lá, treine bem para mais essa competição! <strong>Comente </strong>e diga qual colégio estará representando, além do mais, tire qualquer dúvida!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;O justo se alegrará no SENHOR e confiará nEle; e todos os retos de coração se regozijarão.&#8221;</em> <strong>Salmos 64.10</strong></p>
<p><em>&#8220;Bendito seja Deus, que não rejeitou a minha oração, nem desviou de mim a sua misericórdia.&#8221;</em> <strong>Salmos 66.20</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 8 &#8211; Grafos III</title>
		<link>http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/</link>
		<comments>http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/#comments</comments>
		<pubDate>Mon, 04 May 2009 19:59:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[árvore geradora mínima]]></category>
		<category><![CDATA[dijkstra]]></category>
		<category><![CDATA[floyd-warshall]]></category>
		<category><![CDATA[grafos]]></category>
		<category><![CDATA[prim]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=175</guid>
		<description><![CDATA[Aula 8 - Grafos III
Conteúdo: Apresentação de mais alguns conceitos da teoria dos grafos, assim como algoritmos para resolução da Árvore Geradora Mínima e do menor caminho em um grafo valorado.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Hoje teremos a última parte da aula de grafos (foi dividida em 3), sendo também nossa aula final antes da <strong>2ª fase</strong> da <a title="OBI 2009" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a>. Contudo, o curso <strong>Programando Melhor</strong> não irá terminar, ele continuará presente no blog, com a apresentação futura de tópicos sobre <strong>Programação Dinâmica</strong> e alguns assuntos interessantes, conforme eu for descobrindo, ok? Além disso, o blog voltará a ter <strong>posts sobre assuntos variados</strong>, envolvendo a área de TI em geral, não sendo focado apenas para a parte de Programação (contudo a maioria ainda será de programação, por ser minha <em>&#8220;especialidade&#8221;</em>).</p>
<p><strong>Aula 8 &#8211; Grafos III</strong></p>
<p><strong>Conteúdo: </strong><em>Apresentação de mais alguns conceitos da teoria dos grafos, assim como algoritmos para resolução da Árvore Geradora Mínima e do menor caminho em um grafo valorado.</em></p>
<p><strong>Teoria dos grafos</strong> é o estudo das propriedades das estruturas feitas com grafos. Com ela (a teoria) é possível ter uma linguagem comum ao tratar desse assunto, sendo <strong>a chave para resolver muitos problemas</strong> o fato de identificar esses conceitos fundamentais e implementar algoritmos clássicos para resolvê-los.</p>
<p><strong>Propriedades dos graus</strong></p>
<p>A propriedade mais simples de um vértice é seu <strong>grau</strong>, ou seja, a quantidade de arestas que incidem sobre ele. Existem diversas propriedades importantes do grau de um vértice, como a <em>soma de todos os graus ser igual ao dobro do número de arestas</em>, pelo fato desta contribuir para o grau de vértices adjacentes. Uma consequência disso é que<strong> qualquer grafo possui um número par de vértices com grau ímpar</strong>.</p>
<p><strong>Árvores</strong> são grafos indiretos que não contém ciclos. Os graus dos vértices são importantes para a análise de árvores. A <em>folha</em> de uma árvore é um vértice com grau 1. Cada grupo de <em>n</em> vértices, contém n-1 arestas, portanto uma árvore possui no mínimo duas folhas. Ao retirar uma folha diminui-se a árvore, sem disconectá-la.</p>
<p>Uma <strong>árvore geradora</strong> de um grafo <em>G = (V, E)</em> é um subconjunto de arestas <em>E&#8217;</em> contido em <em>E</em>, tal que<em> E&#8217;</em> é uma árvore com os vértices <em>V</em>. Esse tipo de árvore existe para qualquer <strong>grafo conexo</strong> (com todos os vértices ligados entre si por algum caminho) e é visto pela relação estabelecida no vetor<em> parent[ ]</em>, em <strong>buscas em largura</strong> e <strong>profundidade</strong>.</p>
<p><strong>Árvore Geradora Mínima</strong></p>
<p>Utilizada em grafos valorados, a <em>árvore geradora mínima</em> consiste em buscar a <em>árvore geradora</em> que possui a menor soma dos valores de suas arestas. São a resposta ao tratarmos de problemas sempre que precisarmos ligar um conjunto de pontos pela menor quantidade de canos, fios, etc.</p>
<p>Há dois algoritmos principais para tratar de árvores geradoras mínimas, o de <strong>Kruskal </strong>e o de <strong>Prim</strong>, contudo irei abordar aqui apenas o segundo, por ser mais simples e nos dar uma ótima base para enterder o menor caminho de <strong>Dijkstra</strong>, a seguir.</p>
<p>Primeiramente, generalizaresmos a estrutura de grafos implantada nas aulas anteriores, para utilizarmos grafos valorados.</p>
<p>typedef struct {</p>
<p>int v;            /* vértice adjacente */</p>
<p>int valor;    /* valor da aresta */</p>
<p>} aresta;</p>
<p>typedef struct {</p>
<p>edge edges[MAXV+1][MAXGRAU];    /* informação de adjacência */</p>
<p>int grau[MAXV+1];                                    /* grau de cada vértice */</p>
<p>int nvertices;                                                /* número de vértices no grafo */</p>
<p>int narestas;                                                  /* número de arestas no grafo */</p>
<p>} grafo;</p>
<p><strong>OBS: </strong>lembrando também de ajeitar a inicialização e as buscas apropriadamente, o que não é trabalho complicado.</p>
<p>O <strong>algoritmo de Prim</strong> começa de um vértice inicial e a cada iteração é adicionado um novo vértice na árvore geradora, ligando sempre o menor valor de um vértice dentro da árvore para um vértice fora. A implementação abaixo mantém todas as arestas dos vértices já inclusos na árvore para vértices não-inclusos, sendo o menor incluído na próxima iteração.</p>
<p>prim (grafo *g, int start)<br />
{<br />
int i;      /* contador */<br />
bool intree[MAXV];           /* esse vértice está na árvore? */<br />
int distance[MAXV];          /* distância do vértice ao start */<br />
int v;                       /* vértice atual para ser processado */<br />
int w;                       /* candidato para próximo vértice */<br />
int weight;                  /* valor da aresta */<br />
int dist;                    /* menor distância atual */</p>
<p>for (i=1; i&lt;g-&gt;nvertices; i++)<br />
{<br />
intree[i] = FALSE;<br />
distance[i] = MAXINT;<br />
parent[i] = -1;<br />
}</p>
<p>distance[start] = 0;<br />
v = start;</p>
<p>while (intree[v] == FALSE) {<br />
intree[v] = TRUE;</p>
<p>for (i=0; i&lt;g-&gt;nvertices; i++)<br />
{<br />
w = g-&gt;edges[v][i].v;<br />
weight = g-&gt;edges[v][i].weight;</p>
<p>if ((distance[w] &gt; weight) &amp;&amp; (intree[w] == FALSE))<br />
{<br />
distance[w] = weight;<br />
parent[w] = v;<br />
}<br />
}</p>
<p>v = 1;<br />
dist = MAXINT;</p>
<p>for (i=2; i&lt;=g-&gt;nvertices; i++)<br />
{<br />
if ((intree[i] == FALSE) &amp;&amp; (dist &gt; distance[i]))<br />
{<br />
dist = distance[i];<br />
v = i;<br />
}<br />
}<br />
}<br />
}</p>
<p>Algumas <strong>alterações</strong> nesse método podem (e normalmente devem) ser feitas, de acordo com a necessidade do problema, como <strong>imprimir cada aresta</strong>, à medida que são encontradas ou <strong>armazenar o valor da soma de todas as arestas da árvore,</strong> para retornar no final. Ou seja, foi dado o queijo e a faca para vocês, resta saberem cortá-lo. Algumas variações são, por exemplo, a <strong>árvore geradora máxima</strong> (sendo preciso apenas deixar os valores das arestas negativos), <strong>árvore com menor produto possível das arestas</strong> (substituindo o valor da aresta pelo seu logaritmo).</p>
<p><strong>Menor caminho</strong></p>
<p>O problema de encontrar o menor caminho em grafos não-valorados, já foi discutido na aula anterior, sendo apenas necessário o uso de uma <strong>busca em largura</strong>, no entanto hoje iremos mostrar um algoritmo básico (e eficiente) para tratar desses &#8220;novos tipos de grafos&#8221;:  <a title="Algoritmos para Grafos: Dijkstra - IME/USP" href="http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/dijkstra.html" target="_blank">Dijkstra</a>.</p>
<p><a title="Algoritmos em Grafos - IME/USP" href="http://www.ime.usp.br/~coelho/mac328/pf/floyd.html" target="_blank">Floyd-Warshall</a> é outra opção, mas já fora tratado no aula de <a title="Programando melhor: Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Revisão</a> para a primeira fase da <a title="OBI" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a>, nesse blog, com a aplicação no problema <a title="Batuíra - OBI" href="http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/batuira" target="_blank">Batuíra</a>, da seção pratique do site da <em>Olimpíada Brasileira de Informática</em> e, portanto, não será mais abordado (deem uma olhada no post de Revisão para entender o código).<a title="Algoritmos em Grafos - IME/USP" href="http://www.ime.usp.br/~coelho/mac328/pf/floyd.html" target="_blank"><em></em></a></p>
<p>O <strong>algoritmo de Dijkstra</strong> é um método para encontrar o menor caminho entre dois vértices de um grafo valorado. Dado um vértice particular <em>s</em>, ele encontrará o menor caminho de <em>s</em> para qualquer outro vértice do grafo, incluindo o seu destino<em> t</em>.</p>
<p>A idéia é praticamente igual a de <strong>Prim</strong>, na<em> árvore geradora mínima</em>. A diferença entre eles é como comparar se o próximo vértice é o desejável. No menor caminho nós buscamos o vértice em que a distância até o atual MAIS o seu valor será menor do que o comparado, ou seja:</p>
<p>if (distance[w] &gt; (distance[v]+weight)) {</p>
<p>distance[w] = distance[v] + weight;</p>
<p>parent[w] = v;</p>
<p>}</p>
<p>Ao contrário do algoritmo de <em>Prim</em>, <strong>Dijkstra</strong> <strong>não pode trabalhar com valores negativos</strong>, porém esse problema é insignificante, já que não há aplicação prática para tais valores.<strong> Não se esqueça de exercitar</strong>:</p>
<ul>
<li><a title="Freckles" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10034.html" target="_blank">Freckles &#8211; Nível 2</a></li>
<li><a title="The Necklace" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10054.html" target="_blank">The Necklace &#8211; Nível 3</a></li>
<li><a title="Fire Station" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10278.html" target="_blank">Fire Station &#8211; Nível 2</a></li>
<li><a title="Railroads" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10039.html" target="_blank">Railroads &#8211; Nível 3</a></li>
<li><a title="War" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=onlinejudge&amp;page=show_problem&amp;problem=1099" target="_blank">War &#8211; Nível 3</a></li>
<li><a title="Tourist Guide" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=onlinejudge&amp;page=show_problem&amp;problem=1140" target="_blank">Tourist Guide &#8211; Nível 3</a></li>
<li><a title="The Grand Dinner" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=14&amp;page=show_problem&amp;problem=1190" target="_blank">The Grand Dinner &#8211; Nível 4</a></li>
<li><a title="The Problem With the Problem Setter" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=12&amp;page=show_problem&amp;problem=1033" target="_blank">The Problem With the Problem Setter &#8211; Nível 3</a></li>
</ul>
<p><strong>PS:</strong> Todo o conteúdo desse post e de todo o curso <strong>“Programando melhor”</strong> é baseado no livro <a title="Programming Challenges" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.programming-challenges.com');" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o “resumo” e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" onclick="javascript:pageTracker._trackPageview('/outbound/article/icpcres.ecs.baylor.edu');" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p>Com isso, terminamos nossas dicas antes da <strong>2ª fase da OBI</strong>, o que posso fazer agora é desejá-los <strong>boa prova</strong> e que <strong>Deus vos abençoe.</strong> Atentem principalmente para os assuntos dos posts recomendados a seguir:</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Programando melhor: Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Programando melhor: Revisão</a></li>
<li><a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Programando melhor: Aula 5 &#8211; Backtracking</a></li>
<li><a title="Aula 6 - Grafos I" href="http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/" target="_blank">Programando melhor: Aula 6 &#8211; Grafos I</a></li>
<li><a title="Aula 7 - Grafos II" href="http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/" target="_blank">Programando melhor: Aula 7 &#8211; Grafos II</a></li>
</ul>
<p><em>Vamos lá, estamos na reta FINAL! <strong>Comentem</strong> e tirem suas dúvidas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Os preceitos do SENHOR são retos e alegram o coração; o mandamento do SENHOR é puro e alumia os olhos.&#8221;</em> <strong>Salmos 19.8</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 7 &#8211; Grafos II</title>
		<link>http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/</link>
		<comments>http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 15:33:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[bfs]]></category>
		<category><![CDATA[dfs]]></category>
		<category><![CDATA[OBI]]></category>
		<category><![CDATA[Programming Challenges]]></category>
		<category><![CDATA[UVa Online Judge]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=173</guid>
		<description><![CDATA[Aula 7 - Grafos II
Conteúdo: Aprofundamento com as buscas em largura e profundidade em um grafo, além do menor caminho em grafos não-valorados.]]></description>
			<content:encoded><![CDATA[<p><em>Estou de volta!</em></p>
<p>Como esperado por muitos, o resultado da <a title="OBI" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a> saiu completamente ontem. Para o <strong>RN</strong> o resultado foi bom na categoria <strong>iniciação (mais de 100 aprovados)</strong>, porém deixou a desejar na de <strong>Programação, tendo 2 aprovados em Júnior, 1 no nível 1 e 5 no nível 2</strong>. Como continuação do nosso preparo para a segunda fase da competição, teremos hoje a segunda aula sobre Grafos!</p>
<p><strong>Aula 7 &#8211; Grafos II</strong></p>
<p><strong>Conteúdo:<em> </em></strong><em>Aprofundamento com as buscas em largura e profundidade em um grafo, além do menor caminho em grafos não-valorados.</em></p>
<p>A operação básica na maioria dos grafos é percorrê-lo completamente e sistematicamente. É preciso visitar cada vértice e cada aresta exatamente uma vez em uma ordem pré-definida. Existem dois tipos primordiais de algoritmos para realizar essa atividade: <strong>Busca em Largura</strong> (<em>BFS, do inglês Breadth-First search</em>) e <strong>Busca em Profundidade</strong> (<em>DFS, do inglês Depth-First search</em>). A diferença entre não é nem percebida em certos problemas, pois eles compartilham uma idéia fundamental: <strong>marcar os vértices já explorados para não repetir ações.</strong></p>
<p><strong>Busca em Largura</strong></p>
<p>A <em>Busca em Largura</em> é apropriada se nós não precisarmos de uma ordem específica para a busca ou se nós estamos interessados no menor caminho entre dois vértices para grafos não-valorados. A sua implementação utiliza duas vetores Boolean para manter o conhecimento sobre todos os vértices. Um vértice é <em>descoberto</em> a primeira vez que o visitamos. Um vértice é considerado <em>processado</em> depois de passarmos por todas as arestas provenientes dele.</p>
<p>Uma vez que o vértice é <em>descoberto</em>, ele é colocado em uma fila, sendo <em>processados</em> na <strong>ordem de chegada</strong>, pois os vértices mais antigos na fila são os mais próximos da raiz (local de partida para a busca). Para não encher o post somente com código, colocarei diversos links falando sobre<strong> BFS</strong>, para vocês darem uma olhada neles, depois voltarem para a continuação do post.</p>
<ul>
<li><a title="BFS - Wikipédia" href="http://pt.wikipedia.org/wiki/Busca_em_largura" target="_blank">Busca em largura &#8211; Wikipédia</a></li>
<li><a title="BFS - IME/USP" href="http://www.ime.usp.br/~pf/analise_de_algoritmos/aulas/bfs.html" target="_blank">Busca em largura &#8211; IME/USP</a></li>
<li><a title="BFS - IME/USP" href="http://www.ime.usp.br/~pf/algoritmos_em_grafos/aulas/bfs.html" target="_blank">Busca em largura &#8211; IME/USP &#8211; outra explicação</a></li>
<li><a title="BFS - Wikipedia" href="http://en.wikipedia.org/wiki/Breadth-first_search" target="_blank">Breadth-first search &#8211; Wikipedia</a></li>
</ul>
<p>O comportamento exato da <strong>BFS</strong> depende das funções de <strong>processar o vértice </strong>e <strong>processar a aresta</strong>, sendo essa a forma de personalizar a busca, podendo imprimí-los ou contar o número de arestas. Outra forma de personalizar é na função Boolean de <strong>validar a aresta</strong>, ignorando as não existentes. Ao retornar sempre <em>true</em>, percorreremos todas arestas, sendo uma <strong>BFS completa</strong>.</p>
<p><strong>Encontrando caminhos</strong></p>
<p>O vetor <em>parent</em> utilizado na <strong>bfs( )</strong> é muito útil para encontrar caminhos em um grafo. O vértice que descobriu <em>i</em> é denominado <em>parent[i]</em>. Essa relação define uma <em>árvore de descobertas</em> com o nó inicial como a raiz da árvore.</p>
<p>Pelo fato dos vértices serem descobertos em ordem crescente de distância da raiz, essa árvore tem uma propriedade muito importante. O caminho da <strong>raiz até <em>x</em></strong> (um dos vértices) utiliza o <em>menor número de arestas possível</em> para esse caminho.</p>
<p>Ele pode ser reconstruído seguindo os &#8220;ancestrais&#8221; de <em>x</em> até a raiz, pelo vetor<em> parent[ ]</em>, contudo será um caminho do fim para o começo. Nós podemos &#8220;consertá-lo&#8221; ao guardá-los em uma pilha. É preciso lembrar de dois pontos cruciais na utilização de <strong>BFS</strong>: só é possível descobrir o menor caminho entre <em>x</em> e <em>y</em>, se <em>x</em> for a<strong> raiz do grafo</strong>; além disso, essa ação só é realizada com eficiência em <strong>grafos não-valorados</strong>.</p>
<p><strong>Busca em Profundidade</strong></p>
<p><em>Busca em profundidade</em> utiliza a mesma idéia do <strong>Backtracking</strong>, mostrado na <a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Aula 5 </a>desse curso. Ambos envolvem a busca de todas as possibilidades ao avançar quando for possível e recuar quando não houver nada inexplorado à frente, sendo mais facilmente entendíveis como <strong>algoritmos recursivos</strong>. Essa busca pode ser pensada como <strong>BFS</strong> com uma <strong>pilha</strong> ao invés de <strong>fila</strong>. A parte bela dessa implementação é que a <strong>recursividade elimina a existência explícita de uma pilha</strong>, contudo não irei mostrar aqui o algoritmo completo, novamente sugerindo sites para vê-lo:</p>
<ul>
<li><a title="Busca em Grafos - UFSC" href="http://www.inf.ufsc.br/grafos/represen/busca.html" target="_blank">Busca em Grafos &#8211; UFSC</a></li>
<li><a title="Busca em Profundidade - Wikipédia" href="http://pt.wikipedia.org/wiki/Busca_em_profundidade" target="_blank">Busca em profundidade &#8211; Wikipédia</a></li>
<li><a title="Busca em Profundidade - IME/USP" href="http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/dfs1.html" target="_blank">Busca em profundidade &#8211; IME/USP</a></li>
<li><a title="Busca em Grafos" href="http://www.professeurs.polymtl.ca/michel.gagnon/Disciplinas/Bac/Grafos/Busca/busca.html" target="_blank">Busca em Grafos</a></li>
</ul>
<p>Com essa abordagem, chegamos ao final de mais uma <strong>aula de grafos</strong>, faltando apenas a abordagem de algoritmos como o de <strong>Dijkstra</strong> e da <strong>Árvore Geradora Mínima</strong>, os quais serão abordados próxima semana. Abaixo estão dispostos os exercícios a respeito das <strong>aulas 6 e 7</strong>:</p>
<ul>
<li><a title="Bicoloring" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10004.html" target="_blank">Bicoloring &#8211; Nível 1</a></li>
<li><a title="Playing With Wheels" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10067.html" target="_blank">Playing With Wheels &#8211; Nível 2</a></li>
<li><a title="The Tourist Guide" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10099.html" target="_blank">The Tourist Guide &#8211; Nível 3</a></li>
<li><a title="Slash Maze" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/7/705.html" target="_blank">Slash Maze &#8211; Nível 2</a></li>
<li><a title="Edit Step Ladders" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10029.html" target="_blank">Edit Step Ladders &#8211; Nível 3</a></li>
<li><a title="Tower of Cubes" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10051.html" target="_blank">Tower of Cubes &#8211; Nível 3</a></li>
<li><a title="From Dusk Till Dawn" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10187.html" target="_blank">From Dusk Till Dawn &#8211; Nível 3</a></li>
<li><a title="Hanoi Tower Troubles Again!" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10276.html" target="_blank">Hanoi Tower Troubles Again! &#8211; Nível 3</a></li>
</ul>
<p><strong>PS:</strong> Todo o conteúdo desse post e de todo o curso <strong>“Programando melhor”</strong> é baseado no livro <a title="Programming Challenges" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.programming-challenges.com');" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o “resumo” e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" onclick="javascript:pageTracker._trackPageview('/outbound/article/icpcres.ecs.baylor.edu');" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Divulgação OBMEP" href="http://heltonduarte.com/2009/04/25/divulgacao-obmep/" target="_blank">Divulgação OBMEP</a></li>
<li><a title="Aula 6 - Grafos I" href="http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/" target="_blank">Programando melhor: Aula 6 &#8211; Grafos I</a></li>
<li><a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Programando melhor: Aula 5 &#8211; Bracktracking</a></li>
<li><a title="Programando melhor: Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Programando melhor: Revisão</a></li>
<li><a title="Aula 2 - Estrutura de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">Programando melhor: Aula 2 &#8211; Estrutura de Dados</a></li>
</ul>
<p><em>Vamos lá pessoal! Essas últimas aulas serão cruciais para a segunda fase da OBI, preparem-se! Qualquer dúvida ou dica, <strong>COMENTEM!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Os céus manifestam a glória de Deus e o firmamento anuncia a obra das suas mãos.&#8221;</em> <strong>Salmos 19.1</strong></p>
<p><em>&#8220;A lei do SENHOR é perfeita e refrigera a alma; o testemunho do SENHOR é fiel e dá sabedoria aos símplices.&#8221;</em> <strong>Salmos 19.7</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 6 &#8211; Grafos I</title>
		<link>http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/</link>
		<comments>http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 01:40:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[estruturas de dados]]></category>
		<category><![CDATA[grafos]]></category>
		<category><![CDATA[OBMEP]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=169</guid>
		<description><![CDATA[Aula 6 - Grafos I
Conteúdo: introdução aos conceitos, juntamente com as formas de utilizá-los no campo da computação.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje iniciaremos um assunto pedido a muito tempo por meus conhecidos: os tão temidos <strong>grafos</strong>! Contudo, eu já posso adiantar que eles não são complicados como vocês pensam, pelo menos o nível cobrado na<a title="OBI" href="http://olimpiada.ic.unicamp.br/" target="_blank"> OBI</a>. Os conceitos principais podem ser vistos em diversos locais, como nos sites da <a title="UFSC - Teoria dos Grafos" href="http://www.inf.ufsc.br/grafos/" target="_blank">UFSC</a> e <a title="IMC - USP - Teoria dos Grafos" href="http://www.icmc.usp.br/manuals/sce183/grafos.html" target="_blank">USP</a>, sendo essa uma área muito ampla da computação, recebendo muitas vezes uma disciplina completa nos cursos de <strong>Ciência e Engenharia da Computação</strong>. Para quem gosta de <strong>matemática</strong>, há também uma oportunidade de estudá-la, como no curso de <a title="Grafos, uma introdução" href="http://www.obmep.org.br/export/sites/default/arquivos/5_Grafos.pdf" target="_blank">iniciação científica da OBMEP</a>.</p>
<p><strong>Aula 6 &#8211; Grafos I</strong></p>
<p><strong>Conteúdo: </strong><em>introdução aos conceitos, juntamente com as formas de utilizá-los no campo da computação.</em></p>
<p><strong>Grafos</strong> são um dos temas mais interessantes da <em>ciência da computação</em> &#8211; uma representação abstrata que descreve a organização de <strong>sistemas de transporte, circuitos elétricos, linhas de telecomunicações</strong>, etc. Tantas estruturas diferentes podem ser modeladas utilizando esse conceito, tornando-o uma grande fonte de<strong> resolução de problemas</strong>. Será vistos hoje apenas o elementar dessa teoria, pela sua vasta abrangência, deixando os algoritmos mais específicos para as próximas aulas.</p>
<p><strong>Tipos de Grafos</strong></p>
<p>Um grafo<strong> G = (V, A)</strong> é definido por um conjunto de vértices <em>V</em> e um conjunto de arestas <em>A</em>, as quais consistem em <strong>pares de vértices</strong> contidos em <em>V</em>. Há diversas <strong>propriedades fundamentais</strong> dos grafos que influenciam na escolha de estruturas de dados  utilizadas para representá-los e os algoritmos para analisá-los. Vamos determinar quais são essas propriedades:</p>
<ul>
<li><strong>Indireto vs. Direto </strong>- Um grafo <em>G = (V, A)</em> é <em>indireto</em> se a aresta<em> (x, y)</em> pertencer a <em>A</em> e isso implicar que<em> (y, x) </em>também pertence. Se não, é tido como <em>grafo direto</em>. Ex: Ligações por estradas entre cidades são tipicamente indiretas, porque as estradas são de mão-dupla.</li>
<li><strong>Valorado vs. Não-Valorado </strong>- Em grafos valorados, cada aresta (ou vértice) de G é assinalada com um <em>valor numérico</em>, ou peso. Uma aplicação típica são estradas, as quais são valoradas com a distância ou o tempo para percorrê-la. A diferença entre esses tipos é basicamente para encontrar o <em>menor &#8220;caminho&#8221;</em> entre dois vértices.</li>
<li><strong>Simples vs. Não-Simples</strong> &#8211; Certos tipos de arestas complicam a tarefa de trabalhar com grafos. Um <strong>laço</strong> é uma aresta<em> (x, x) </em>envolvendo somente um vértice. Uma aresta <em>(x, y) </em>é <strong>múltipla</strong> se ocorre mais de uma vez no mesmo grafo. Um grafo que não possui nenhum desses tipos de aresta é chamado <em>Grafo Simples</em>.</li>
</ul>
<p><strong>Estrutura de Dados para Grafos</strong></p>
<p>Há muitas formas possíveis de representar um grafo, por isso nos focalizaremos nas mais comuns e úteis. Será assumido o grafo <em>G = (V, A) </em>contendo <em>n</em> vértices e <em>m</em> arestas.</p>
<ul>
<li><strong>Matriz de adjacência</strong> &#8211; Nós podemos representar <em>G</em> usando uma matriz M<em> n x n</em>, onde o elemento <em>M[i,j]</em> é 1 se <em>(i, j) </em>é uma aresta de G e 0 (zero) se não for. Isso permite respostas rápidas para a questão &#8220;(i,j) está em G?&#8221; e atualizações rápidas para inserir ou deletar arestas. Todavia, esse tipo de representação pode usar espaço excessivo na memória, ao ter muitos vértices e poucas arestas.</li>
<li><strong>Listas de adjacência</strong> &#8211; Uma forma mais eficiente de representar é usando <a title="Aula 2 - Estrutura de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">listas encadeadas</a> para guardar os adjacentes a cada vértice. Esse tipo requer ponteiros mas não tenha medo se já passou por experiências desagradáveis com eles. Listas de adjacência dificulta para saber se <em>(i, j) </em>está em <em>G</em>, contudo é MUITO mais econômico com memória.</li>
<li><strong>Listas de Adjacência em Matrizes</strong> &#8211; Listas de adjacências podem estar embutidas em <em>matrizes</em>, eliminando a necessidade de ponteiros. Nós podemos representar a lista em um vetor (ou na linha de uma matriz) mantendo um contador <em>k</em> de quantos elementos há e colocando-os nos primeiros <em>k</em> elementos do vetor. Agora é possível visitar os elementos do primeiro ao último da mesma forma deuma lista, mas incrementando o índice em um <em>loop</em> ao invés de ponteiros. Esse forma é particularmente importante no caso de grafos estáticos, os quais não mudam após sua construção e será sempre utilizada nos exemplos seguintes.</li>
</ul>
<p>Nós representamos um grafo usando a seguinte estrutura de dados: para cada grafo nós contabilizamos o número de vétices e os assinalamos de 1 a <em>nvertices</em>. As arestas estão em uma matriz MAXV x MAXGRAU, para cada vértice poder ser adjacente a outros MAXGRAU. Podemos definir MAXGRAU como MAXV, contudo isso seria desperdício em casos de grafos com graus baixos.</p>
<p>#define MAXV 100;              /* máximo número de vértices */</p>
<p>#define MAXGRAU 50;       /* máximo grau de um vértice */</p>
<p>typedef struct {</p>
<p>int arestas [MAXV+1][MAXGRAU];       /* informação de adjacência */</p>
<p>int grau[MAXV+1];            /* grau de cada vértice */</p>
<p>int nvertices;                        /* número de vértices no grafo */</p>
<p>int narestas;                        /* número de arestas no grafo */</p>
<p>} grafo;</p>
<p>Para demonstrar o uso dessa estrutura de dados, nós mostraremos como <strong>ler um grafo</strong>, tendo uma linha inicial o <strong>número de vértices e arestas no grafo</strong>, seguido por uma lista de arestas com um par de vértices por linha.</p>
<p>ler_grafo (grafo *g, bool direto)</p>
<p>{</p>
<p>int i;          /* contador */</p>
<p>int m;       /* número de arestas */</p>
<p>int x, y;   /* vértices em uma aresta (x, y) */</p>
<p>inicializar_grafo (g);</p>
<p>scanf (&#8220;%d %d&#8221;, &amp;(g-&gt;nvertices), &amp;m);</p>
<p>for (i = 1; i &lt;= m; i++) {</p>
<p>scanf (&#8220;%d %d&#8221;, &amp;x, &amp;y);</p>
<p>inserir_aresta (g, x, y, direto);</p>
<p>}</p>
<p>}</p>
<p>inicializar_grafo (grafo *g)</p>
<p>{</p>
<p>int i;            /* contador */</p>
<p>g-&gt;nvertices = 0;</p>
<p>g-&gt;narestas = 0;</p>
<p>for (i = 1; i &lt;= MAXV; i++) g-&gt;grau[i] = 0;</p>
<p>}</p>
<p>O método principal é o <strong>inserir_aresta</strong>. O parâmetro Boolean <em>direto</em> é utilizado para identificar quando é preciso inserir duas cópias de cada aresta ou só uma. Preste atenção no uso da recursão para resolver o problema.</p>
<p>inserir_aresta (grafo *g, int x, int y, bool direto)</p>
<p>{</p>
<p>if (g-&gt;grau[i] &gt; MAXGRAU)</p>
<p>printf (&#8220;Atenção: a inserção (%d, %d) excede o grau máximo\n&#8221;, x, y);</p>
<p>g-&gt;arestas[x][g-&gt;grau[x]] = y;</p>
<p>g-&gt;grau[x] ++;</p>
<p>if (direto == FALSE) inserir_aresta(g, y, x, TRUE)</p>
<p>else g-&gt;narestas ++;</p>
<p>}</p>
<p>Agora, a tarefa de imprimir o grafo é um trabalho bem simples:</p>
<p>imprimir_grafo (grafo *g)</p>
<p>{</p>
<p>int i, j;                 /* contadores */</p>
<p>for (i = 1; i &lt;= g-&gt;nvertices; i++) {</p>
<p>printf (&#8220;%d:  &#8220;, i);</p>
<p>for (j = 0; j &lt;= g-&gt;grau[i]; j++) {</p>
<p>printf (&#8221; %d&#8221;, g-&gt;arestas[i][j]);</p>
<p>}</p>
<p>printf (&#8220;\n&#8221;);</p>
<p>}</p>
<p>}</p>
<p>Bem pessoal, por hoje é só. Infelizmente, os <em>algoritmos de manipulação mais específica</em> de um grafo ficarão para a próxima aula, ok? E, como foram dados apenas conceitos, <strong>excepicionalmente hoje não haverá seção de exercícios.</strong> =(</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Programando melhor: Aula 5 &#8211; Backtracking</a></li>
<li><a title="Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Programando melhor: Revisão</a></li>
<li><a title="Aula 4 - Ordenação" href="http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/" target="_blank">Programando melhor: Aula 4 &#8211; Ordenação</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_blank">Programando melhora: Aula 3 &#8211; Strings</a></li>
</ul>
<p><em>O que vocês acharam de grafos? Qualquer dúvida é só <strong>Comentar!</strong> Para treinar, façam os exercícios da apostila de grafos da iniciação científica da OBMEP, indicada no início, pois são muito bons. Além do mais, qualquer erro, principalmente na parte de código, porque é frequente o WordPress deixar estranho, é só avisar por comentário, ok?<br />
</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;A minha alma disse ao SENHOR: Tu és o meu SENHOR; não tenho outro além de ti.&#8221;</em> <strong>Salmos 16.2</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 5 &#8211; Backtracking</title>
		<link>http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/</link>
		<comments>http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 17:46:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[backtracking]]></category>
		<category><![CDATA[permutações]]></category>
		<category><![CDATA[subconjuntos]]></category>
		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=167</guid>
		<description><![CDATA[Aula 5 - Backtracking
Conteúdo: Explicação a respeito de algoritmos de Backtracking, técnica facilitadora em casos de problemas pesados.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal, estou de volta!!!</em></p>
<p>Para quem estava com saudades das aulas do <strong>&#8220;Programando melhor&#8221;</strong>, venho anunciar a volta com tudo do curso! Estive parado durante um tempo para resolver a<em> migração do blog</em>, além de estabelecer a <em>parceria com a Hostnet</em>, empresa a qual hospeda esse site. No entanto, tenho a alegria de informá-los que mais uma aula está pronta!</p>
<p><strong>Aula 5 &#8211; Backtracking</strong></p>
<p><strong>Conteúdo:</strong> <em>Explicação a respeito de algoritmos de Backtracking, técnica facilitadora em casos de problemas pesados.</em></p>
<p>A força bruta pode ser eficiente na resolução de problemas simples na área de computação, devido ao grande poder já presente nos computadores atuais, com média de 2GHz de clock do processador, ou seja, realizando 2 bilhões de operações por segundo! Contudo, existem casos em que a complexidade da situação exige <em>técnicas mais sofisticadas</em>, sendo uma delas o <strong>Backtracking</strong>!</p>
<p><strong>Backtracking</strong> é um método para iterar (percorrer) todas as possíveis configurações em um espaço qualquer. É um algoritmo geral que poderá ser personalizado para cada tipo de aplicação. De modo geral, a solução será um vetor <em>a = (a1, a2, &#8230;, a-n)</em>, sendo cada elemento <em>a-i</em> selecionado de um conjunto <em>Si</em>. Os exemplos mais comuns, os quais serão mostrados posteriormente, são a <em>criação de permutações e de subconjuntos</em>.</p>
<p>A cada passo do algoritmo, começa-se com uma solução parcial, diga-se <em>a = (a1, a2, &#8230;, a-k)</em>, e tenta-se aumentá-la, adicionando outro elemento ao seu fim. Após adicioná-lo, é preciso testar se há uma solução completa &#8211; se sim, deve-se imprimí-la, contá-la ou qualquer ação necessária. Se não é necessário checar se essa solução parcial é ainda expansível para alguma completa. Se for, continue testando, se não então apague o último elemento de a e teste outra possibilidade para aquela posição. O código é mostrado abaixo:</p>
<p>bool finished = FALSE;          /* Já encontrou todas as soluções? */</p>
<p>backtrack (int a[], int k, data input)</p>
<p>{</p>
<p>int c[MAXCANDIDATES];       /* Candidatos para a próxima posição */</p>
<p>int ncandidates;                         /* Número de candidatos para a próxima posição */</p>
<p>int i;            /* Contador */</p>
<p>if (is_a_solution(a, k, input))</p>
<p>process_solution(a, k, input);</p>
<p>else {</p>
<p>k = k + 1;</p>
<p>construct_candidates (a, k, input, c, &amp;ncandidates);</p>
<p>for (i = 0; i&lt;ncandidates; i++) {</p>
<p>a[k] = c[i];</p>
<p>backtrack(a, k, input);</p>
<p>if (finished) return;             /* Terminar mais cedo */</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>As sub-rotinas utilizadas no algoritmo serão especificadas abaixo:</p>
<ul>
<li><strong>is_a_solution(a, k, input)</strong> &#8211; Esse função booleana testa se os primeiros <em>k</em> elementos do vetor <em>a</em> são uma solução completa. O último argumento, <em>input</em>, permite-o utilizar informações proveitosas para essa rotina.</li>
<li><strong>construct_candidates(a, k, input, c, &amp;ncandidates)</strong> &#8211; Preenche um vetor<em> c</em> com todos os candidatos possíveis para a <em>k-ésima</em> posição de<em> a</em>, dado o conteúdo das primeiras <em>k-1</em> posições. O número de candidatos retornado é <em>ncandidates</em> e a variável <em>input</em> é novamente para alguma função auxiliar necessária.</li>
<li><strong>process_solution(a,k)</strong> &#8211; Esse método apenas imprime, conta ou faz algo necessário para o determinado problema, quando uma solução completa está pronta. A variável auxiliar, <em>input,</em> é desnecessária nessa situação.</li>
</ul>
<p><strong>Backtracking</strong> assegura o acerto por enumerar todas as possilidades sem visitar nunca o mesmo estado, sendo também <em>eficiente</em>. A<strong> recursividade</strong> promove a elegância e a fácil implementação desse algoritmo, porque o vetor de novos candidatos, <em>c</em>, é alocado com um procedimento recursivo.</p>
<p>As principais aplicações do <strong>backtracking</strong> são da criação de <a title="Backtracking - Subconjuntos" href="http://pt.wikipedia.org/wiki/Backtracking" target="_self">todos os subconjuntos de um conjunto S</a> e na criação de <a title="Backtracking - Permutações" href="http://pt.wikipedia.org/wiki/Backtracking" target="_self">todas as suas permutações</a>. Os links foram colocados para o <a title="Wikipédia.org" href="http://pt.wikipedia.org" target="_self">Wikipédia</a> para que o post não fique muito grande, ok?</p>
<p>Abaixo seguem os exercícios para o treinamento do assunto (confesso que estão difíceis dessa vez):</p>
<ul>
<li><a title="Little Bishops" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/8/861.html" target="_self">Little Bishops &#8211; Nível 2</a></li>
<li><a title="15-Puzzle Problem" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10181.html" target="_self">15-Puzzle Problem &#8211; Nível 3</a></li>
<li><a title="Queue" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=13&amp;page=show_problem&amp;problem=1069" target="_self">Queue &#8211; Nível 2</a></li>
<li><a title="Servicing Stations" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10160.html" target="_self">Servicing Stations &#8211; Nível 3</a></li>
<li><a title="Tug of War" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10032.html" target="_self">Tug of War &#8211; Nível 2</a></li>
<li><a title="Garden of Eden" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10001.html" target="_self">Garden of Eden &#8211; Nível 2</a></li>
<li><a title="Color Hash" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/7/704.html" target="_self">Color Hash &#8211; Nível 3</a></li>
<li><a title="Bigger Square Please..." href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10270.html" target="_blank">Bigger Square Please&#8230; &#8211; Nível 3</a></li>
</ul>
<p><strong>PS:</strong> Todo o conteúdo desse post e de todo o curso <strong>“Programando melhor”</strong> é baseado no livro <a title="Programming Challenges" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.programming-challenges.com');" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o “resumo” e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" onclick="javascript:pageTracker._trackPageview('/outbound/article/icpcres.ecs.baylor.edu');" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_self">Programando melhor: Revisão</a></li>
<li><a title="Aula 4 - Ordenação" href="http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/" target="_self">Programando melhor: Aula 4 &#8211; Ordenação</a></li>
<li><a title="OBI vem aí!" href="http://heltonduarte.com/2009/03/07/obi-vem-ai/" target="_self">OBI vem aí!</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_self">Programando melhor: Aula 3 &#8211; Strings</a></li>
</ul>
<p><em>Vamos lá, pessoal! Não desistam porque estamos em preparação para a segunda fase da OBI, agora é pra valer! <strong>Comentem</strong> sobre o que vocês acharam do post e tirem suas dúvidas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;O SENHOR prova o justo, mas a sua alma aborree o ímpio e o que ama a violência.&#8221;</em> <strong>Salmos 11.5</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Revisão</title>
		<link>http://heltonduarte.com/2009/03/27/programando-melhor-revisao/</link>
		<comments>http://heltonduarte.com/2009/03/27/programando-melhor-revisao/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 01:02:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[jolly jumpers]]></category>
		<category><![CDATA[OBI]]></category>
		<category><![CDATA[the trip]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=164</guid>
		<description><![CDATA[Programando melhor: Revisão
Alguns pontos importantes para serem revisados antes da prova da OBI, além de comentários sobre a prova depois de sua realização.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Como a prova da<strong> primeira fase da OBI</strong> é amanhã resolvi fazer esse post para uma revisão rápida de vocês sobre algumas questões importantes.</p>
<p>Primeiramente, quero avisá-los para termos bastante <strong>atenção</strong> com a <strong>quantidade de loops feitos</strong>, pois diversos loops encadeados podem fazer você não passar em alguns dos testes feitos (normalmente passará nos mais simples, contudo não conseguirá a pontuação completa).</p>
<p>Segundo vim trazer mais um assunto possível para a prova, o qual explicarei posteriormente na aula sobre grafos, no entanto colocarei um exemplo de fácil entendimento da seção pratique da OBI, do nível 2, <a title="Batuíra - OBI" href="http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/batuira" target="_blank">Batuíra</a> (código resolvido abaixo):<code><br />
#include </code></p>
<p>#define INF 1000000;</p>
<p>int main()<br />
{<br />
/* Batuíra */<br />
int num = 1;  /* Número do teste */<br />
int n, x, y, z;  /* Quantidade de pontos e variáveis para distância */<br />
int dist[110][110];          /* Grafo para distância dos pontos */<br />
int i, j, k;    /* Contadores para loop for */</p>
<p>/* O Grafo dist[110][110] representa as distâncias entre os pontos de<br />
repouso. Por exemplo, o valor de dist[i][j] é a distância entre os pontos<br />
i e j */</p>
<p>/* Entrada do número de pontos */<br />
scanf (&#8220;%d&#8221;, &amp;n);</p>
<p>while (n != 0)<br />
{<br />
/* Coloca a distância padrão entre os pontos */<br />
for (i = 1; i &lt;= n; i++)<br />
{<br />
for (j = 1; j &lt;= n; j++)<br />
{<br />
if (i == j)<br />
{<br />
dist[i][j] = 0;    /* A distância para o próprio<br />
ponto de repouso é zero */<br />
}<br />
else<br />
{<br />
dist[i][j] = INF; /* Diz que a distância entre os pontos<br />
é &#8220;infinita&#8221;, ou seja, não há ligação entre eles */<br />
}<br />
}<br />
}</p>
<p>/* Lê os pontos e a distância entre eles */<br />
scanf (&#8220;%d %d %d&#8221;, &amp;x, &amp;y, &amp;z);<br />
/* A distância do ponto x ao ponto y é igual a z */</p>
<p>while (x != 0)       /* Quando qualquer valor for zero é o fim da<br />
entrada dos pontos */<br />
{<br />
/* Coloca as distâncias nas duas direções */<br />
dist[x][y] = z;<br />
dist[y][x] = z;</p>
<p>/* Lê os pontos e a distância entre eles */<br />
scanf (&#8220;%d %d %d&#8221;, &amp;x, &amp;y, &amp;z);<br />
}</p>
<p>/* Algoritmo de Floyd-Warshall */<br />
for (k = 1; k &lt;= n; k++)<br />
{<br />
for (i = 1; i &lt;= n; i++)<br />
{<br />
for (j = 1; j &lt;= n; j++)<br />
{<br />
/* Se houver um ponto de repouso entre i e j com uma<br />
menor distância, então o valor de pontos[i][j] é<br />
substituído pelo de (dist[i][k] + dist[k][j]) */<br />
if ((dist[i][k] + dist[k][j]) &lt; dist[i][j])<br />
{<br />
dist[i][j] = dist[i][k] + dist[k][j];<br />
dist[j][i] = dist[i][k] + dist[k][j];<br />
}<br />
}<br />
}<br />
}</p>
<p>/* Depois desse laço principal o valor de dist[1][n] é a menor<br />
distância entre o ponto inicial e o final, a qual representa o valor<br />
pedido pelo problema */</p>
<p>/* Saída de dados */<br />
printf (&#8220;Teste %d\n%d\n\n&#8221;, num, dist[1][n]);</p>
<p>/* Incremento para o próximo caso de teste */<br />
num++;</p>
<p>/* Entrada para o próximo caso de teste */<br />
scanf (&#8220;%d&#8221;, &amp;n);<br />
}</p>
<p>return (0);<br />
}</p>
<p>Fiquem bem atentos a parte de grafo, além do famoso <a title="Algoritmo de Floyd-Warshall" href="http://pt.wikipedia.org/wiki/Algoritmo_de_Floyd-Warshall" target="_blank">algoritmo de Floyd-Warshall</a>, o qual é suficientemente eficiente para esse problema.</p>
<p>Serão colocados comentários com dicas para os problemas <strong>&#8220;The Trip&#8221;</strong>, em <a title="Exercícios 1 (Parte I)" href="http://heltonduarte.com/2009/02/13/programando-melhor-exercicios-1-parte-1/" target="_blank">Exercícios 1 (Parte I)</a> e <strong>&#8220;Jolly Jumpers&#8221;</strong>, na <a title="Aula 2 - Estruturas de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">Aula 2</a>, pois foram resolvidos por mim no site do <a title="UVa Online Judge" href="http://icpcres.ecs.baylor.edu/onlinejudge/" target="_blank">UVa Online Judge</a> (finalmente).</p>
<p>Por fim, boa sorte a todos os que irão participar da competição amanhã (<strong>OBI</strong>), tomara que seja uma boa prova! Eu também participarei, esperando um bom resultado,<em> se Deus quiser</em>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aula 4 - Ordenação" href="http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/" target="_blank">Programando melhor: Aula 4 &#8211; Ordenação</a></li>
<li><a title="OBI vem aí!" href="http://heltonduarte.com/2009/03/07/obi-vem-ai/" target="_blank">OBI vem aí!</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_blank">Programando melhor: Aula 3 &#8211; Strings</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
</ul>
<p><em>E você, como se preparou para a OBI? Ah, quando a prova terminar, postem suas opiniões aqui e vamos discutir as questões! <strong>Comentem!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Entrega o teu caminho ao Senhor, confia nEle e Ele tudo fará.&#8221;</em><strong><em> </em>Salmos 37.5</strong></p>
<p><em>&#8220;O meu escudo está com Deus, que salva os retos de coração.&#8221;</em> <strong>Salmos 7.10</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/03/27/programando-melhor-revisao/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

