polska Posted May 2, 2012 at 05:59 PM Report #452773 Posted May 2, 2012 at 05:59 PM 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... 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.
pmg Posted May 2, 2012 at 08:17 PM Report #452807 Posted May 2, 2012 at 08:17 PM 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!
polska Posted May 2, 2012 at 08:43 PM Author Report #452811 Posted May 2, 2012 at 08:43 PM 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.
pmg Posted May 2, 2012 at 08:52 PM Report #452814 Posted May 2, 2012 at 08:52 PM 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!
polska Posted May 2, 2012 at 08:59 PM Author Report #452817 Posted May 2, 2012 at 08:59 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now