algoritmo: do Lat. algorithmos < Ár. alkharizmi: [Inform.] conjunto de etapas bem definidas necessárias para chegar à resolução de um problema.
June 15, 2007
Depois de meses sem postar, resolvi que a partir de agora darei mais atenção pra este blog. Muita gente me manda e-mail e comentários com dúvidas e gostaria de deixar bem claro que eu não faço trabalhos de faculdade pra ninguém, mas que se você tiver uma dúvida real onde eu possa ajudar eu ajudarei de bom grado.
Pensei muito sobre o que postar aqui, tenho rascunhos sobre buscas em grafos e sobre resoluções de problemas de grafos, mas resolvi quebrar toda a ordem e, a partir de um scrap de orkut, acabei me lembrando do problema Escada perfeita, da OBI 2006, e me deu vontade de resolvê-lo aqui.
A programação deste problema é extremamente simples, mas a sua lógica (matemática pura) é muito inteligente. Tente resolver o problema antes de ver minha solução e, caso não consiga, depois veja como a solução é bonita.
Uma construtora, durante a criação de um parque temático, encontrou no terreno um conjunto de várias pilhas de cubos de pedra. Ao invés de pagar pela remoção dos cubos de pedras, um dos arquitetos da empresa achou interessante utilizar as pedras para decoração do parque, determinando que as pedras fossem rearranjadas no formato de "escada". para isso, os funcionários deveriam mover alguns cubos para formar os degraus das escadas. Só que o arquiteto decidiu que, entre uma pilha e outra de pedras deveria haver exatamente uma pedra de diferença, formando o que ele chamou de escada perfeita. O exemplo abaixo mostra um conjunto de cinco pilhas de pedras encontradas e as cinco pilhas como ficaram após a arrumação em escada perfeita.

Dada uma seqüência de pilhas de cubos de pedras com suas respectivas alturas, você deve determinar o número mínimo de pedras que precisam ser movidas para formar uma escada perfeita com exatamente o mesmo número de pilhas de pedras encontrado inicialmente (ou seja, não devem ser criadas ou eliminadas pilhas de pedras). O degrau mais baixo da escada deve sempre estar do lado esquerdo.
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrão (normalmente o teclado). A primeira linha contém um inteiro n que indica o número de pilhas de pedras. A segunda linha contém N números inteiros que indicam a quantidade de cubos de pedras em cada uma das pilhas, da esquerda para a direita.
Seu programa deve imprimir, na saída padrão, uma única linha, contendo um inteiro: o número mínimo de cubos de pedras que devem ser movidos para transformar o conjunto de pilhas em uma escada perfeita, conforme calculado pelo seu programa. Caso não seja possível efetuar a transformação em escada perfeita, imprima como resultado o valor -1.
Entrada 5 5 4 5 4 2 Saída 5
Entrada 6 9 8 7 6 5 4 Saída 9
Entrada 2 1 5 Saída -1
OK. Estão prontos?
Depois de pensar um pouco, conclui-se que:

e
). Resumindo um pouco os cálculos, depois de alguma manipulação algébrica você chega a:

). Ao mesmo tempo, adicionamos à outra variável (moves) a quantidade de quadradinhos que devem ser retirados ou colocados na fileira (porque depois se esta variável não for igual a 0 imprimimos -1). Ficou claro?
, número de blocos do primeiro degrau.
, número de blocos do último degrau.
, soma da PA.#include <stdio.h>
#define PMAX 10001
int main() {
int i, j;
int n;
int soma=0;
int a, b;
int pilha[PMAX];
int moves=0;
int movimentos=0;
scanf("%d", &n);
for (i=0; i<n; i++) {
scanf("%d", &pilha[i]);
soma+=pilha[i];
}
b=(((2*soma)/n)+(n-1))/2;
a=1+b-n;
for (i=0; i<n; i++) {
moves+=(pilha[i]-(i+a));
if (pilha[i]>i+a) {
movimentos+=(pilha[i]-(i+a));
}
}
if (moves!=0) {
printf("-1n");
} else {
printf("%dn", movimentos);
}
return 0;
}
Prontinho!
Qualquer dúvida escrevam seus comentários.
Compare Preços de: Algoritmos: Teoria e Prática, notebooks HP Pavilion, notebooks Acer, notebooks Sony Vaio, Programming Challenges
Muito bom seu blog. Muito bem explicado e as demonstrações são ótimas.
Pena que o pessoal não sabe fazer bom uso…
Vou mostrar a um amigo meu, que estuda programação.
Eu só vim relembrar o que são algoritmos computacionais.
Sds,
Rafael
P.S. Você devia ensinar!
Boa dedução do problema, principalmente sobre a parte de dedução do número de movimentos necessários. Mas eu nao me conformei muito com essa variável ‘moves’ pra verificar se é uma escada perfeita.
De qualquer forma, uma boa solução.
(obs.: você não é tão rigoroso quanto eu, esse código pode ter erros, segundo minha deduções, nos scanf()’s. imagine um EOF num scanf(), qual é o valor atribuido à variável? bem, de qualquer forma isso não vem ao caso, mas talvez em uma olimpíada fosse necessário, junto das restrições de valores.
estou querendo fazer a OBI ano que vem (2008), te enviei um e-mail e até agora não obtive resposta, estou aguardando a resposta dele ainda.)
Este design foi copiado do CSS Zen Garden e modificado com autorização de seu autor, Gunta Klavina.
Todo o conteúdo deste site (incluindo textos, imagens, arquivos de áudio e quaisquer outros trabalhos), exceto quando especificado o contrário, está licenciado por Tiago Madeira sob uma Licença Creative Commons.