polska Posted April 18, 2012 at 06:09 PM Report #449791 Posted April 18, 2012 at 06:09 PM Boas pessoal, eu vou participar nas ONI, e devido a isso fui tentando resolver os problemas do servidor de estudo da ONI... E realizei o problema A da qualificação 2009 ... Ao enviar, o meu programa estava correcto, mas no entanto apenas 68%, não 100%... A minha prof falou-me da eficiência do programa... E tentou-me ajudar modificando o programa.. Mas mesmo assim o resultado manteve-se, então mandei uma pergunta ao juri, este mesmo respondeu-me também falando da eficiência... Então, mais uma vez, a minha prof tentou-me ajudar, e falou-me da pesquisa binária, já que o prog faz arrastamentos de vector e assim, e então modificou o meu programa, utilizando a pesquisa binária para me indica a posição onde devo colocar o numero no vector, sendo então melhorada a eficiência, pois em vez de recorrer a pesquisa sequência do meu vector com 100000 posições, utiliza a pesquisa binária e depois para remover e adicionar torna-se mais fácil também... Contudo!.. O programa ainda desceu a percentagem, de 68%. para 56%... Alguma idea do que fazer??? #include <stdio.h> #include <string.h> //#include <stdlib.h> int v[100000],ultimo=0; int PesquisaBinaria (int chave) { int inf = 0; //Limite inferior (o primeiro elemento do vetor em C é zero ) int sup = ultimo-1; //Limite superior (termina em um número a menos 0 à 9 são 10 numeros ) int meio; while (inf <= sup) { meio = inf + (sup-inf)/2; if (chave < v[meio]) sup = meio-1; else inf = meio+1; } return sup+1; // não encontrado } void adiciona(int energia){ int pos=PesquisaBinaria(energia); for(int i=ultimo;i>pos;i--){ v[i]=v[i-1]; } v[pos]=energia; ultimo++; /*for(int i=0;i<ultimo;i++){ printf("%d ",v[i]); } printf("\n");*/ } void retiraMAX(){ printf("%d\n",v[ultimo-1]); ultimo--; } void retiraMIN(){ printf("%d\n",v[0]); for(int i=0;i<ultimo;i++){ v[i]=v[i+1]; } ultimo--; } int main(){ int A,R,E; char p[5]; scanf("%d %d",&A,&R); for(int i=1;i<=A+R;i++){ scanf("%s",p); if(strcmp(p,"BAK")==0){ scanf("%d",&E); adiciona(E); } if(strcmp(p,"MAX")==0){ retiraMAX(); } if(strcmp(p,"MIN")==0){ retiraMIN(); } } //system("pause"); return 0; } Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
pikax Posted April 18, 2012 at 06:17 PM Report #449795 Posted April 18, 2012 at 06:17 PM esse problema e' o A da ONI 2011 Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
skiller10 Posted April 18, 2012 at 06:19 PM Report #449796 Posted April 18, 2012 at 06:19 PM Que estruturas de dados conheces? "Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."
HappyHippyHippo Posted April 18, 2012 at 06:25 PM Report #449801 Posted April 18, 2012 at 06:25 PM está mito pesado pela razão que o adicionar um elemento ao vector pode ser mesmo muito pesado: se tiveres 999 elementos no vector e fores adicionar o menor, terás de mover todos os elementos do vector uma posição para a frente Que estruturas de dados conheces? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
xtrm0 Posted April 18, 2012 at 06:27 PM Report #449803 Posted April 18, 2012 at 06:27 PM Ao utilizares a pesquisa binaria mantens a mesma complexidade, ja que tens de mover sempre a array toda para cima quando a adicionas. <Signature goes here>
polska Posted April 18, 2012 at 06:59 PM Author Report #449810 Posted April 18, 2012 at 06:59 PM A minha prof disse que a pesquisa binária é o método mais eficiente, por isso é que eu disse que o prog se iria tornar mais eficiente.. Que estruturas de dados conheces? Ao que vos referis com estruturas de dados? Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
HappyHippyHippo Posted April 18, 2012 at 07:02 PM Report #449813 Posted April 18, 2012 at 07:02 PM isto : http://en.wikipedia.org/wiki/Binary_tree IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
skiller10 Posted April 18, 2012 at 07:06 PM Report #449815 Posted April 18, 2012 at 07:06 PM Binary Trees são um exemplo, mas existem muitas mais... Acho que deves começar por aprender filas, pilhas, binary tress.. "Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."
polska Posted April 18, 2012 at 07:18 PM Author Report #449817 Posted April 18, 2012 at 07:18 PM Ah! A minha prof falou-me disso, das árvores binárias e tudo, mas não me ensinou nada disso, nem nenhuma das que referiste sei... Eu tou no 10º, ainda é cedito.. xD , mas aprendendo isso, conssigo uma maior eficácia nos programas? Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
skiller10 Posted April 18, 2012 at 07:34 PM Report #449823 Posted April 18, 2012 at 07:34 PM Cada problema é um problema. Se leres o 2º artigo da academia ONI podes reparar que existem vários tipos de problemas. "Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."
polska Posted April 18, 2012 at 07:39 PM Author Report #449824 Posted April 18, 2012 at 07:39 PM claro, o meu deu Time Limit Exceeded, mas o jurí disse que tudo tinha haver com a eficiência do programa.. "Tens "Time Limit Exceeded" porque o teu programa não tem a eficiência necessária para teres os 100 pontos. As Olimpíadas são um concurso de carácter algorítmico e para ter os 100 pontos tipicamente não chega ter um algoritmo correcto. É necessário que seja eficiente, ou seja que passe dentro dos limites temporais e de memória dados. Se quiseres tentar perceber como este problema poderia ser feito para 100 pontos podes por exemplo usar o fórum." Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
JoaoSantos95 Posted April 18, 2012 at 07:46 PM Report #449825 Posted April 18, 2012 at 07:46 PM Eu usei uma priority queue, é uma pilha com a particularidade de ordenar logo os valores que tu metes para dentro dela. http://www.cplusplus.com/reference/stl/priority_queue/ - tens ai a página dela no site cplusplus, não é difícil de usar, basta entenderes bem o top, o push e o pop para resolveres este exercício mas claro, convém saberes as restantes funções no caso de precisares de usar isto no futuro. Dica: Pensa no caso de ser pedido o mínimo, alguma dúvida já sabes
pikax Posted April 18, 2012 at 07:53 PM Report #449828 Posted April 18, 2012 at 07:53 PM Da' uma vista de olhos no topico das ONI do ano passado encontras la' boas resolucoes http://www.portugal-a-programar.pt/index.php?showtopic=42003 Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
xtrm0 Posted April 18, 2012 at 08:02 PM Report #449830 Posted April 18, 2012 at 08:02 PM Se utilizasses o mesmo algoritmo em c++ com um vector com inserts, deixavas de ter esse problema de efeciencia (acho eu). <Signature goes here>
Dr_Lion Posted April 21, 2012 at 07:03 PM Report #450440 Posted April 21, 2012 at 07:03 PM Em vez de usares vectores experimenta usar listas ligadas, ou biligadas. A eficiência das duas varia consoante as tarefas que pretendas executar. Por exemplo para removeres um elemento a meio de uma lista biligada é tranquilo, encontras o valor, e com os ponteiros que apontam para o nó anterior e seguinte, obtens esses nós, e alteras no nó anterior o ponteiro para o nó seguinto, passando a ser o valor que tinha o nó que vais remover. No nó seguinte ao que ias remover, alteras o ponteiro para o nó anterior ao que removeste. Para efectuares este processo numa lista ligada, terias que andar com variáveis manhosas para garantires que tinhas a posição anterior sem teres que percorrer a lista outra vez, o facto de percorreres a lista mais do que uma vez (para a mesma tarefa) é um factor que reduz a eficiencia desta. Normalmente com os truqes que usas na implementação duma lista ligada para a percorreres apenas uma vez, acaba por reduzir na mesma a eficiência da utilização da lista ligada "com truqes" em relação a uma lista biligada. Ainda assim uma lista ligada "com truqes" é mais eficiente que uma lista ligada normal para tarefas de inserção/remoção de objectos.
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