Jump to content

Recommended Posts

Posted

Boas pessoal, estou a fazer os exercícios de treino do toPAS2011 e estou com problemas no penúltimo,  eu já fiz o código, mas no teste do 2º output que eles dão o meu prog está a falhar, o exercício consiste no seguinte:

Gente do norte que tencionava fazer praia no Algarve e Andaluzia nas férias da Páscoa, foi surpreendida por ventos, aguaceiros e um muito frio. "Blancos llegaron y más blancos volvieron", pelo que já sonham com uma semana ou quinze dias de férias que planeiam gozar em Junho, Julho, Agosto ou Setembro, se o subsídio de férias não for na enxurrada. Parece que não irá...Assim, um grupo de amigos optimistas está já a tentar escolher uma semana de férias, de acordo com as preferências e indisponibilidades de cada um. Essa semana (sete dias de férias) tem de começar numa segunda-feira e terminar no domingo seguinte ou, em alternativa, começar num sábado e terminar na sexta-feira seguinte. Cada membro do grupo indicou uma sequência de períodos que não se sobrepõem e classificou cada período usando inteiros: -1 para assinalar indisponibilidade e valores de 1 a 5 para manifestar preferências, sendo 5 o nível máximo. Nos períodos que não incluiu, também está disponível mas com nível de preferência zero, se os amigos acharem boa ideia ou se não existir alternativa. A classificação serve para pontuar analogamente cada dia do período referido. A semana escolhida será uma em que todos possam ir, após 1 de Junho (quarta-feira) e com fim antes de 12 de Setembro de 2011, e que tenha a pontuação máxima, considerando a soma das pontuações acumuladas nos sete dias, após processamento das preferências de todos. Se existir mais do que uma semana possível, escolherão a mais próxima, não vá o frio voltar em força.

Input

Uma primeira linha com o número de membros do grupo. Segue-se igual número de blocos, cada um contendo as preferências ou indisponibilidades de um membro do grupo. Um bloco começa por um inteiro positivo que denota o número de períodos que o membro referiu e depois, em cada linha, tem um quinteto no formato "dia mês dia mês preferência", por exemplo, 16 6 30 6 3 (que representaria o período de 16 de Junho a 30 de Junho com preferência 3 em cada um dos dias desse período; se fosse 16 6 30 6 -1, indicaria que o membro não poderia ir nesse período).

Output

Se existir uma semana em que todos possam, indicará a data de início das férias no formato: número do dia seguido de um espaço seguido de de Junho, de Julho, de Agosto ou de Setembro. Caso contrário, a palavra inconsistente.

Exemplo 1

Input

3

2

10 7 7 9 -1

10 6 23 6 5

2

1 6 15 7 -1

25 7 26 7 4

1

23 6 25 6 -1

Output

inconsistente

Exemplo 2

Input

5

6

16 6 30 6 3

8 7 8 7 -1

9 7 31 7 5

5 8 12 8 5

23 8 31 8 2

7 6 8 6 -1

1

1 6 31 7 4

1

1 8 5 9 1

2

3 7 20 8 4

1 9 9 9 -1

3

15 6 8 7 5

15 8 31 8 -1

7 9 10 9 5

Output

9 de Julho

No caso de teste 1, o meu prog dá inconsistente, está correcto, ja no segundo, o resultado é 7 de Setembro...  :wallbash:

O meu prog é este:

#include <stdio.h>
#include <stdlib.h>

int main(){
int membros,blocos,m[1000][5],bloco[1000],conta=0,conta1=0,conta2=0,dia=0,mes=0,c;
bool r;
scanf("%d",&membros);
for(int i=0;i<membros;i++){
	scanf("%d",&blocos);
	bloco[i]=blocos;
	for(int j=0;j<blocos;j++){
		scanf("%d %d %d %d %d",&m[i][0],&m[i][1],&m[i][2],&m[i][3],&m[i][4]);
	}
}
for(int i=0;i<membros;i++){
	c=bloco[i];
	for(int j=0;j<c;j++){
		conta=0;conta1=0,conta2=0;
		if(m[j][4]!=-1){
			conta++;
			for(int l=i+1;l<membros;l++){
				conta1=0;conta2=0;
				for(int k=bloco[l];k<membros;k++){
					if(m[k][4]!=-1 && m[k][1]==m[j][1] && m[k][0]>=m[j][0] && m[k][2]<=m[j][2]){
						conta1++;
					}
					if(m[k][4]!=-1 && m[k][1]!=m[j][1]){
						conta2++;
					}
					if(conta2==bloco[l]){
						conta++;
					}else{
						conta=conta+conta1;
					}
				}
				if(conta==membros){
					if(m[j][0]>dia && m[j][1]>mes){
						dia=m[j][0];mes=m[j][1];
					}
				}
			}
		}
	}
}

if(mes==6){
	printf("%d de Junho\n",dia);
}else{
	if(mes==7){
		printf("%d de Julho\n",dia);
	}else{
		if(mes==8){
			printf("%d de Agosto\n",dia);
		}else{
			if(mes==9){
				printf("%d de Setembro\n",dia);
			}else{
				printf("Inconsistente\n");
			}
		}
	}
}
return 0;
}

Eu coloquei um breakpoint a partir do segundo for, para ver o que estava a falhar, e tipo, ele não estava a verificar cada linha direito, por exemplo, ele devia começar na linha 16 6 30 6 3, então esta aqui esta condição que começa nesta linha, if(m[j][4]!=-1){ , contudo, o programa verifica linhas que já vão no meio do input, acho que passa logo para a linha 1 6 31 7 4 , e eu não estou a perceber mesmo porquê ... :x, eu sei que a minha resolução é extremamente confusa mas opah, o que eu aprendi ainda é á base disto, ciclos, funções, apontadores(pouco),arrays e matrizes... Não tenho conhecimentos ainda de estruturas de dados e assim, normal para quem está no 10º xD, mas pronto, para compensar a figurinha que vou fazer dia 18 na final das olimpiadas, estou-me a concentrar mais no toPAS, e noutro que e sem ser por equipas, por isso toda a ajuda é bem vinda 🙂

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Primeiro erro que eu detectei ...

#include <stdio.h>
#include <stdlib.h>

int main(){
int membros,blocos,m[1000][5],bloco[1000],conta=0,conta1=0,conta2=0,dia=0,mes=0,c;
bool r;
scanf("%d",&membros);
for(int i=0;i<membros;i++){
	scanf("%d",&blocos);
	bloco[i]=blocos;
	for(int j=0;j<blocos;j++){
		scanf("%d %d %d %d %d",&m[i][0],&m[i][1],&m[i][2],&m[i][3],&m[i][4]);
	}
}
/* ... */
}

No ciclo interior estas sempre a escrever no mesmo elemento do array m, nomeadamente o m[ i ]. O acesso aos elementos do array devia ter em conta o j.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Primeiro erro que eu detectei ...

No ciclo interior estas sempre a escrever no mesmo elemento do array m, nomeadamente o m[ i ]. O acesso aos elementos do array devia ter em conta o j.

realmente... Mas se eu guardar no j e vez do i, depois quando o i mudar e voltar a fazer o ciclo for, vou sobrepor as posições na mesma, porque o j volta a 0.. :s

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

realmente... Mas se eu guardar no j e vez do i, depois quando o i mudar e voltar a fazer o ciclo for, vou sobrepor as posições na mesma, porque o j volta a 0.. :s

Pois, como dizes, a solucao nao é substituir o i por j. Tens que pensar mais um pouco e estruturar os dados de outra forma.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Pois, como dizes, a solucao nao é substituir o i por j. Tens que pensar mais um pouco e estruturar os dados de outra forma.

Não é difícil, mete-se uma variável inicializada a 0 e vai aumentando depois de serem inseridos os dados na sua posição.. Agora a solução dá Inconsistente, nos dois casos..

int main(){
int membros,blocos,m[1000][5],bloco[1000],conta=0,conta1=0,conta2=0,dia=0,mes=0,c=0;
bool r;
scanf("%d",&membros);
for(int i=0;i<membros;i++){
	scanf("%d",&blocos);
	bloco[i]=blocos;
	for(int j=0;j<blocos;j++){
		scanf("%d %d %d %d %d",&m[c][0],&m[c][1],&m[c][2],&m[c][3],&m[c][4]);
		c++;
	}
}

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.