Notei que algumas pessoas enfrentam problemas ao entender a forma de como será dada a entrada/saída dos problemas. Aqui vai um exemplo de como se deve interpretar a entrada e saída de um problema do Spoj:
Problema: 811. Quermesse
Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém um número inteiro positivo
Nque indica o número de participantes da festa. A linha seguinte contém a sequência, em ordem de entrada, dosNingressos das pessoas que participaram da festa. O final da entrada é indicado quandoN = 0. Para cada conjunto de teste da entrada haverá um único ganhador.Saída
Para cada conjunto de teste da entrada seu programa deve produzir três linhas. A primeira linha identifica o conjunto de teste, no formato
"Teste n", ondené numerado a partir de 1. A segunda linha deve conter o número do ingresso do ganhador, conforme determinado pelo seu programa. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.Exemplo de entrada
4 4 5 3 1 10 9 8 7 6 1 4 3 2 12 10 0Exemplo de saída
Teste 1 3 Teste 2 10Restrições
0 <= N <= 10000(N = 0 apenas para indicar o fim da entrada)
Quando um problema diz que a entrada é composta de vários conjuntos de teste, então quer dizer que haverá um novo caso de teste enquanto a condição de parada seja satisfeita. No problema acima, cada caso de teste é composto por um inteiro N e em seguida por N inteiros. Nota-se que nos problemas de online judges nunca será necessário alocação dinâmica, percebemos nesse caso que haverá um vetor de inteiros onde o seu tamanho máximo será definido pela variável N. Observando as restrições impostas pelo problema acima, basta declarar um vetor com 10001 posições (a posição 0 conta).
int i,n,teste,ganhador,v[10001];
teste=1;
while (scanf("%d",&n) && n){ //Enquanto eu ler a variável N e essa variável for diferente de 0
for (i=0;i<n;++i) //Armazena os N inteiros em um vetor
scanf("%d",&v[i]);
//Aqui vai o processamento desse vetor
printf("Teste %d\n",teste++); //Primeira linha Teste x
printf("%d\n\n",ganhador); //Segunda linha o ganhador seguido por duas quebras de linhas, pois no enunciado, está claro que a terceira linha da saída deve ser em branco.
}
Espero que tenha esclarecido um pouco a forma como se deve ler e imprimir em um problema de online judge. Aconselho a dar uma lida no site criado pelo Vinicius Fortuna com intuito de auxiliar os iniciantes em maratonas e afins.
Ainda tem dúvidas? Entre em contato ou deixe um comentário.
Dado um inteiro , retorne
seguindo as seguintes restrições:
Link: http://br.spoj.pl/problems/F91/
Temos dois casos básicos para o problema:
Para o primeiro caso executaremos a propria definição do algoritmo:
O segundo caso é mais "complicado", segue a definição:
Note que, se temos um inteiro x, sendo ,
retornará x+1.
Como dada na definição, o retorno de será
Considerando , notamos que
Pelas equações anteriores temos:
Logo,
Se temos agora um inteiro k, , temos que
Note que k+11 está nos limites de
, logo
, e temos que
, que como provado anteriormente, retornará 91.
O mesmo façamos para uma variavél, ,
claramente retornará 91.
Ou seja, o algoritmo baseia-se em:
[]'s Phyllipe César
Publicado por Delacyr Categoria: Geral
24 Feb 2010Testando o latex no wordpress:
Tarefa:
Dado um inteiro N, determine quanto vale N2.
Entrada:
A entrada é composta por um único caso de teste, composto por uma única linha que contém o inteiro N.
Como resolver:
Fácil como o problema Soma também da OBI, basta ler um inteiro N, e imprimir uma multiplicação do inteiro com ele mesmo. Assim:
printf("%d\n",n*n);
Problema: 3829. Quadrados
Ainda tem dúvidas? Entre em contato ou deixe um comentário.
Tarefa:
Dada uma lista de N inteiros, encontre a soma de todos eles.
Entrada:
A entrada é composta de um único caso de teste. A primeira linha contém um inteiro positivo N. As N linhas seguintes contêm cada uma um inteiro X, representando os N números a serem somados.
Saída:
Seu programa deve produzir uma única linha na saída, contendo a soma de todos os N inteiros.
Como resolver:
Através de um laço de 1 até N, bastará ler um número a cada iteração, acumulá-lo (somar) em uma variavel denominada soma, e quando sair do laço fazer a impressão dessa variável. Simples.
Problema: 3830. Soma
Ainda tem dúvidas? Entre em contato ou deixe um comentário.
Tarefa
Dada uma seqüência de informações sobre partidas de Par ou Ímpar (nomes dos jogadores e números que os jogadores escolheram), você deve escrever um programa para indicar o vencedor de cada uma das partidas.
Como resolver:
Uma das formas de se resolver esse problema (não quer dizer que é a mais fácil) é após ler um inteiro N e os os nomes de cada um dos jogadores (jogador 1 sempre é par, jogador 2 sempre é impar), utilizar um vetor de strings para guardar o nome do vencedor a cada jogada.
struct reg{
char nome[11];
}vetor[1000];
Dentro do laço de N iterações, você lerá os dois valores A e B, após lê-los, basta fazer uma verificação da soma dos valores. Se a soma for par, só copiar o nome do jogador para o vetor de strings na posição i (onde i corresponde a i-ésima iteração). Como copiar strings? Utilizando a função strcpy da string.h.
strcpy(string_destino,string_origem);
Ao final, basta imprimir o vetor de strings seguindo a formatação recomendada pelo problema.
Problema: 1363. Par ou ímpar
Ainda tem dúvidas? Entre em contato ou deixe um comentário.
Tarefa
Sua tarefa é, dado um inteiro K (1 <= K <= 10^1000000 ou seja, K pode ter 1000000 de dígitos), determinar os três últimos dígitos do número de bacilos após K instantes de tempo, partindo de uma população inicial com um indivíduo.
Como resolver:
Diante de uma rápida análise do problema KOCH, podemos perceber que se trata de manipulação de big numbers, quem nunca trabalhou com big numbers, aconselho baixar o The Art of Programming Contest (está ali na barra lateral), - um e-book com instruções, códigos genéricos e problemas de maratonas de programação em geral-, pois iremos precisar dele.
Para quem ainda não sacou a idéia, os números de bacilos após K instantes de tempo é simplesmente a sequência de fibonacci. Mas como conseguir o instante K da sequência de fibonacci, quando K pode ter 1000000 de dígitos? Precisaremos manipular big numbers. Para nos poupar tempo, já existe um algoritmo pronto para calcular qualquer instante da sequência de fibonacci, onde esse instante pode ser um número muito grande. (Ver página 219 - The Art of Programming Contest).
Com o código em mãos, nos resta pouco para resolver esse problema. Pesquisando no fórum do SPOJ, descobrimos que existe um padrão da resposta a cada 1500 instantes, então nos bastará apenas utilizar o resto da divisão de K por 1500, mas como fazer divisão de big numbers? Você descobrirá na página 215 no The Art of Programming Contest).
Agora que você já sabe como calcular qualquer big number instante da sequência de fibonacci e também sabe que o resto da divisão de K por 1500 é o número de bacilos, como iremos imprimir apenas os 3 últimos dígitos desse resto? Basta que você você divida novamente o resto por 1000. Independente do valor dessa divisão, para imprimir sempre 3 dígitos, mesmo que o valor dê menos que 3 dígitos, a formatação se dará dessa forma:
printf("%03ld",variavel); //03, quer dizer 3x o número zero
Veja no site do Vinícius Fortuna, os vários formatos de entrada e saída para competições em geral.
Problema: 3090. Crescimento das populações de bacilos
Dúvidas? Entre em contato ou deixe um comentário.
Tarefa
Vó Vitória está ?cando velha e tem medo que deslizes de memória a façam cometer injustiças com os netos, deixando de compensar as diferenças entre os cofrinhos. Sua tarefa é ajudar Vó Vitória, escrevendo um programa de computador que indique as diferenças entre os depósitos, de forma que ela não tenha que preocupar-se em memorizá-las.
Como resolver:
Inicialmente, para armazenar - e depois imprimir - as diferenças de depósitos de Joãozinho e Zezinho, você necessitará utilizar um vetor zerado. Uma dica é utilizar a função memset da bibiliteca string.h. Após feito isso, inicia-se o processo de guardar a diferença entre o depósito do Zezinho e Joãozinho. Dentro de um laço de N iterações, você lerá o valor do depósito de cada um deles. Após a leitura dos depósitos, agora é o momento de guardar a diferença dos depósitos no vetor, lembrando que você deve tratar juntamente com a diferença do depósito anterior. Ficando dessa forma:
diferenca[i]=(diferenca[i-1]+deposito_joaozinho)-deposito_zezinho;
Assim você trata de incluir a diferença do depósito feito anteriormente no cáculo da nova diferença de depósitos entre os netos da Vó Vitória.
Problema: 840. Cofrinhos da Vó Vitória
Dúvidas? Entre em contato ou deixe um comentário.
Tarefa
São dados:
As linhas que delimitam a fazenda são paralelas aos eixos cartesianos. Sua tarefa é escrever um programa que determine quantos meteoritos caíram dentro da fazenda (incluindo meteoritos que caíram exatamente sobre as linhas que delimitam a fazenda).
Como resolver:
Esse problema é de simples solução, o objetivo do METEORO é descobrir quantos meteoritos caíram dentro da fazenda. Depois que você ler os as coordenadas de um retângulo (X1, Y1, X2, Y2), dentro de um laço com N iterações, ler os pontos (X,Y) e após cada leitura, já comparar com as coordenadas do retângulo para descobrir se o meteorito caiu dentro da fazendo ou não. Para tal, basta verificar se X está entre X1 e X2 e Y entre Y1 e Y2, caso essa verificação seja verdadeira, some 1 meteorito a mais que caiu dentro da fazenda, depois basta imprimir tal variável.
Problema: 1330. Meteoros
Dúvidas? Entre em contato ou deixe um comentário.
História
As Ilhas Weblands formam um reino independente nos mares do Pacífico. Como é um reino recente, a sociedade é muito influenciada pela informática. A moeda oficial é o Bit; existem notas de B$ 50,00, B$10,00, B$5,00 e B$1,00. Você foi contratado(a) para ajudar na programação dos caixas automáticos de um grande banco das Ilhas Weblands.
Tarefa
Sua tarefa é escrever um programa que, dado o valor de Bits desejado pelo cliente, determine o número de cada uma das notas necessário para totalizar esse valor, de modo a minimizar a quantidade de cédulas entregues. Por exemplo, se o cliente deseja retirar B$50,00, basta entregar uma única nota de cinquenta Bits. Se o cliente deseja retirar B$72,00, é necessário entregar uma nota de B$50,00, duas de B$10,00 e duas de B$1,00.
Como resolver:
Para esse problema, basta que você tenha conhecimento dos operadores de divisão e resto, que são "/" e "%", respectivamente. O que você vai fazer é simplesmente manipular o valor de Bits que o cliente informou. Para saber o número mínimo de notas a ser entregue, basta que você guarde em cada variável declarada para cada tipo de nota (50,10,5 e 1), o resultado da divisão do Bit informado pelo cliente por 50, 10, 5, 1, mas claro, antes de passar para a próxima divisão, atualize o valor que restou de Bits, fazendo com que esse valor (bits informado pelo cliente) receba o resto da divisão do valor de bits pelo valor da nota em questão. Ex: (Bit = Bit % 50). Ao final, basta imprimir as variáveis de cada nota.
Problema: 812. Bits Trocados
Dúvidas? Entre em contato ou deixe um comentário.
Criado com objetivo de compartilhar informações sobre tudo que diz respeito a algoritmos, estruturas de dados e problemas de online judges.
Dúvidas ou sugestões? Entre em contato.