Ir ao conteúdo
  • Cadastre-se

C Melhorar o desempenho do programa


Ruhan Ligabue

Posts recomendados

Fala galera, beleza?

 

Seguinte, estou fazendo um desafio que foi proposto pela professora da minha cadeira de estrutura de dados, que seria fazer o desafio 1167 do URI Online Judge, mas usando listas encadeadas, eu consegui fazer, porém ele ta estourando o tempo limite, alguém tem uma sugestão do que eu poderia mudar no código para abaixar o tempo?

 

Segue o código

 

/*****************************************************************/
/* Acampamento de Férias                                         */
/* programador: Ruhan Ligabue                                    */
/* criado em: 30/09/2017                                         */
/* data da ultima alteracao: 06/10/2017                          */
/* https://www.urionlinejudge.com.br/judge/en/problems/view/1167 */
/*****************************************************************/

#include <stdio.h>

typedef struct{
    char nome[30];
    int valor;
}INFORMACAO;

typedef struct{
    INFORMACAO info;
    struct LISTA* ant;
    struct LISTA* prox;
}LISTA;


void cria_lista(LISTA** l);
void inclui_crianca (LISTA** l);
void entrada_dados (LISTA* aux);
void jogo(LISTA** l,int num);

int main(void){
    int i,num;
    LISTA* l;

    do{
        cria_lista(&l);
        do{
            printf("Digite o numero de criancas: ");
            scanf("%d",&num);
        }while(num < 1 || num > 101);

        for(i = 0; i < num; i++)
            inclui_crianca(&l);
        jogo(&l,num);
    }while(num != 0);
    return(0);
}

void cria_lista(LISTA** l){
  *l= NULL;
}

void entrada_dados(LISTA* aux){
    int count = 0;
    do{
        printf("Digite o nome e o numero da crianca: ");
        fflush(stdin);
        scanf("%s %d",&aux->info.nome, &aux->info.valor);
        while (aux->info.nome != '\0') {
            count++;
        }
    }while((aux->info.valor >= 1 || aux->info.valor <= 500)&&(count <= 30));
    aux->prox = NULL;
    aux->ant = NULL;
}

void inclui_crianca(LISTA** l){
    LISTA* p;
    LISTA* aux;
    LISTA* no = (LISTA *) malloc(sizeof(LISTA));

    p = *l;

    entrada_dados(no);
    if(*l == NULL){
        *l = no;
    }
    else{
        if(p->prox == NULL){
            no->prox = p;
            p->ant = no;
            p->prox = no;
        }
        else{
            aux = p->prox;
            aux->ant = no;
            p->prox = no;
            no->prox = aux;
            no->ant = p;
        }
    }
}

void jogo(LISTA** l,int num){
    LISTA* p;
    LISTA* aux;
    int i,j,rep;

    p = *l;
    j = p->info.valor;

    for(rep = num; rep > 0; rep--){
        if(j%2 == 0){
            for(i = 0;i <= j; i++)
                p = p->ant;
            j = p->info.valor;
            aux = p->ant;
            aux->prox = p->prox;
            aux = p->prox;
            aux->ant = p->ant;
        }
        else{
            for(i = 0;i <= j; i++)
                p = p->prox;
            j = p->info.valor;
            aux = p->ant;
            aux->prox = p->prox;
            aux = p->prox;
            aux->ant = p->ant;
        }
    }
    printf("Vencedor(a): %s\n",p->info.nome);
    free(p);
}

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Não sei se culpo o professor ou você.

Vou pelo básico.

1. No URI e em qualquer ferramenta de competição, não se conversa com o usuário, esse printf pedindo para digitar algo da erro, apenas leia com o scanf.

2. URI é uma ferramenta usada para competidor, se você pegar sua solução da aula e enviar no URI vai estourar o tempo, qualquer probleminha do URI de nível 2 já precisa de alguns conceitos matemáticos, aquela coisa de calcular número primo indo até o próprio número não existe no URI, não vai passar. Pesquise métodos rápidos para resolver aquilo que você já sabe.

3. Se o programa pede como resposta: Fatorial de x = y, e o seu printf colocar: O fatorial de x é y, vai dar erro.

4. Pelo amor de deus diz pra sua professora que não se usa C no URI, ele força o uso de ponteiros por parte do programador e isso é horroroso.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!