segunda-feira, 28 de junho de 2010

Olá! Já que eu aprendi a usar o SyntaxHighlighter, vou publicar um problema visto na aula da TAP. A seguir a descrição dele:

Cartas
João pegou um baralho com um certa quantidade de cartas numeradas e, depois de algum esforço, conseguiu colocá-las em ordem numérica, da menor para a maior. Agora, ele quer organizá-las em colunas e, por razões estéticas, quer as colunas ordenadas em ordem não crescente de comprimentos, os quais devem ser aproximadamente iguais ou seja, o comprimento de duas colunas não podem diferir por mais de uma carta. Além disso, ele quer distribuir as cartas sequencialmente por colunas, ou seja, ele quer distribuir todas as cartas da primeira coluna, depois todas as cartas de segunda coluna e assim por diante. Escreva um programa que execute esta tarefa.

Entrada:

A entrada conterá um inteiro T, o número de casos de testes e, para cada caso de teste, uma linha com os inteiros N (1 <= N <= 1000), a quantidade de cartas, e M (1 <= M <=100), a quantidade de colunas. As cartas são numeradas de 1 a N. Não há duas cartas com o mesmo número. Saída:

A saída deve conter, para cada caso de teste, uma linha com as quantidades das cartas em cada coluna e na sequência, a distribuição das cartas.

Exemplo:

Entrada:
2
4 3
37 5

Saida:
02 01 01
| Carta 001 | Carta 003 | Carta 004 |
| Carta 002 |
08 08 07 07 07
| Carta 001 | Carta 009 | Carta 017 | Carta 024 | Carta 031 |
| Carta 002 | Carta 010 | Carta 018 | Carta 025 | Carta 032 |
| Carta 003 | Carta 011 | Carta 019 | Carta 026 | Carta 033 |
| Carta 004 | Carta 012 | Carta 020 | Carta 027 | Carta 034 |
| Carta 005 | Carta 013 | Carta 021 | Carta 028 | Carta 035 |
| Carta 006 | Carta 014 | Carta 022 | Carta 029 | Carta 036 |
| Carta 007 | Carta 015 | Carta 023 | Carta 030 | Carta 037 |
| Carta 008 | Carta 016 |

Para resolver este problema, deve calcular o resto da quantidade de cartas pela quantidade de colunas. Com isso, você deverá adicionar a cada coluna, começando da primeira à esquerda, um elemento. Feito isso, a impressão é dada da seguinte forma: O primeiro elemento é o número 1, o segundo elemento é o primeiro mais a quantidade de elementos da primeira coluna, o terceiro elemento é a soma do segundo elemento com a quantidade dos elementos da segunda coluna e assim por diante. A seguir, o código em detalhes:


#include<stdio.h>
int main(){
int t; //quantidade de testes
int n; //quantidade de cartas
int m; //quantidade de colunas
int q,r; //quociente e resto
int i, j, anterior; //auxiliares
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &m);
if((n>=1) && (n<=1000) && (m>=1)&&(m<=100)){
q = n/m;
r = n % m;
int vet[m];
for(i =0; i < m ; i++){
vet[i] = q;
}
for(i=0; i < r ; i++){
vet[i] = vet[i] + 1;
}
for(i=0; i < m ; i++){
printf("%.2d ", vet[i]);
}
printf("\n");
for(i=1; i <= vet[0] ; i++){
anterior = i;
printf("| Carta ");
printf("%.3d ", i);
if(i <= q){
for(j=0; j < (m-1) ; j++){
printf("| Carta %.3d ", vet[j]+anterior);
anterior = vet[j]+anterior;
}
}
else{//imprime os ultimos elementos
for(j=0; j < (r-1) ; j++){
printf("| Carta %.3d ", vet[j]+anterior);
anterior = vet[j]+anterior;
}
}
printf("|\n");
}
}
}
return 0;
}

Nenhum comentário:

Postar um comentário