Ir ao conteúdo

Posts recomendados

Postado
#include<stdio.h>

#include<stdlib.h>

struct Node{

    int data;

    struct Node *next;

};



struct Node* SortedMerge(struct Node* a, struct Node* b);

void FrontBackSplit(struct Node* source,struct Node** frontRef, struct Node** backRef);

void printContador(struct Node *a, struct Node *a2);

void MergeSort(struct Node** headRef){

    struct Node* head = *headRef;

    struct Node* a;

    struct Node* b;

    if ((head == NULL) || (head->next == NULL)) {

        return;

    }

     FrontBackSplit(head, &a, &b);

     MergeSort(&a);

    MergeSort(&b);

    *headRef = SortedMerge(a, b);

}

    struct Node* SortedMerge(struct Node* a, struct Node* b){

    struct Node* result = NULL;

    if (a == NULL)

        return (b);

    else if (b == NULL)

        return (a);

    if (a->data >= b->data) {

        result = a;

        result->next = SortedMerge(a->next, b);

    }

    else {

        result = b;

        result->next = SortedMerge(a, b->next);

    }

    return (result);

}

void FrontBackSplit(struct Node* source,struct Node** frontRef, struct Node** backRef){

    struct Node* fast;

    struct Node* slow;

    slow = source;

    fast = source->next;

    while (fast != NULL) {

        fast = fast->next;

        if (fast != NULL) {

            slow = slow->next;

            fast = fast->next;

        }

    }

    *frontRef = source;

    *backRef = slow->next;

    slow->next = NULL;

}

void push(struct Node** head_ref, int new_data){

    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));

    new_node->data = new_data;

    new_node->next = (*head_ref);

    (*head_ref) = new_node;

}

int main(){

    int n=0;

  while (scanf("%i",&n)!=EOF){

        int *arr;

  int *arr2;

 arr=calloc(n, sizeof(int));

  arr2=calloc(n, sizeof(int));

  int j=0;

    while (j<n){

        scanf("%i",&arr[j]);

        j++;

    }

    int  i=0;

    struct Node *a = NULL;

   while(i< n){

        push(&a, arr[i]);

        i++;

   MergeSort(&a);

   }

for(int g=0; g<n; g++){

        scanf("%i",&arr2[g]);

    }

    int  s;

    struct Node *a2 = NULL;

    for (s = 0; s< n; s++)

       push(&a2, arr2[s]);

    MergeSort(&a2);

     printContador(a,a2);

    getchar();

    free(arr);

   free(arr2);

   free(a);

   free(a2);

   }



    return 0;

}



void printContador(struct Node *a,struct Node *a2){

    int contador=0;

    struct Node *temp = a;

   struct Node *temp2= a2;

  while( temp2 != NULL){

  while ( temp != NULL){

     if (temp2->data > temp->data){

        contador++;

        temp = temp->next;

        break;

        free(temp);

free(temp2);

     }

     temp = temp->next;

  }

  temp2 = temp2->next;

}

printf("%i\n",contador);

free(temp);

free(temp2);

}

Jogo

 

Você e seu amigo estão se divertindo, jogando um jogo de tabuleiro. Nele, cada jogador tem um baralho de cartas e ambos têm a mesma quantidade de cartas. Estas cartas representam personagens que se enfrentam em diversas lutas. Então ocorrerá sucessivas lutas, onde um personagem de um dado jogador vai enfrentar um personagem do oponente. Como regra, cada personagem irá participar de uma única luta. Ao final do jogo, ganha o jogador que mais vezes derrotar seu oponente. Cada baralho é formado por diversos personagens, e cada um tem certa pontuação de luta. Em cada luta de personagens, vence aquele com maior pontuação de luta. Se ambos têm a mesma pontuação de luta, declara-se empate e ninguém vence. Sua tarefa é: conhecendo a pontuação de luta das suas cartas e das cartas do seu oponente, calcule o número máximo de lutas que você pode ganhar se os seus personagens forem confrontados em uma ordem apropriada.

Input

Em cada entrada há vários casos de teste. Cada um seguindo a forma: primeira linha contém um número que representa a quantidade de cartas de cada jogador (1 ≤ C ≤ 105). A segunda linha contém C números, que representam as pontuações de luta dos personagens do seu oponente (1 ≤ Ci ≤ 109). A terceira linha contém outros C números, que representam as pontuações de luta dos seus próprios personagens.

Output

Para cada caso de teste, imprima uma linha contendo o número máximo de lutas que você pode vencer.

Restrições da Solução C

Seu código não pode usar rotinas de biblioteca para manipular/alterar os dados.

Apenas as rotinas de biblioteca p/ interação com o teclado/tela (ex., printf, scanf, gets, ...) e as rotinas relacionadas à alocação de memória (ex. malloc, calloc, ...) são permitidas.

Seu código não deve usar variáveis globais.

Seu programa deve usar alocação dinâmica de memória

Seu código deve ser formado por funções e/ou procedimentos criados por você.

 

Deve haver no mínimo 1 funções/procedimentos.

 

Exemplo

Input:

7 3 87 59 42 11 17 68 20 55 9 71 4 7 81 8 99 85 95 38 42 20 20 92 73 33 52 24 83 49 40 38

Output:

5 4

Exemplo

Input:

8 63 10 28 3 17 77 99 41 83 28 73 35 18 88 19 57 9 86 27 43 9 87 89 51 17 72 28 42 21 69 83 49 32 83 12

Output:

7 6

 

 

O código abaixo funciona só que preciso transformá-lo para vetor como faço isso? Pelo que entendi só posso usar variável local e nesse código foi usado variável global. Preciso entregá-lo amanha cedo. É um trabalho de faculdade. 

 

 

#include<stdio.h>

#include<stdlib.h>

struct Node{

    int data;

    struct Node *next;

};



struct Node* SortedMerge(struct Node* a, struct Node* b);

void FrontBackSplit(struct Node* source,struct Node** frontRef, struct Node** backRef);

void printContador(struct Node *a, struct Node *a2);

void MergeSort(struct Node** headRef){

    struct Node* head = *headRef;

    struct Node* a;

    struct Node* b;

    if ((head == NULL) || (head->next == NULL)) {

        return;

    }

     FrontBackSplit(head, &a, &b);

     MergeSort(&a);

    MergeSort(&b);

    *headRef = SortedMerge(a, b);

}

    struct Node* SortedMerge(struct Node* a, struct Node* b){

    struct Node* result = NULL;

    if (a == NULL)

        return (b);

    else if (b == NULL)

        return (a);

    if (a->data >= b->data) {

        result = a;

        result->next = SortedMerge(a->next, b);

    }

    else {

        result = b;

        result->next = SortedMerge(a, b->next);

    }

    return (result);

}

void FrontBackSplit(struct Node* source,struct Node** frontRef, struct Node** backRef){

    struct Node* fast;

    struct Node* slow;

    slow = source;

    fast = source->next;

    while (fast != NULL) {

        fast = fast->next;

        if (fast != NULL) {

            slow = slow->next;

            fast = fast->next;

        }

    }

    *frontRef = source;

    *backRef = slow->next;

    slow->next = NULL;

}

void push(struct Node** head_ref, int new_data){

    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));

    new_node->data = new_data;

    new_node->next = (*head_ref);

    (*head_ref) = new_node;

}

int main(){

    int n=0;

  while (scanf("%i",&n)!=EOF){

        int *arr;

  int *arr2;

 arr=calloc(n, sizeof(int));

  arr2=calloc(n, sizeof(int));

  int j=0;

    while (j<n){

        scanf("%i",&arr[j]);

        j++;

    }

    int  i=0;

    struct Node *a = NULL;

   while(i< n){

        push(&a, arr[i]);

        i++;

   MergeSort(&a);

   }

for(int g=0; g<n; g++){

        scanf("%i",&arr2[g]);

    }

    int  s;

    struct Node *a2 = NULL;

    for (s = 0; s< n; s++)

       push(&a2, arr2[s]);

    MergeSort(&a2);

     printContador(a,a2);

    getchar();

    free(arr);

   free(arr2);

   free(a);

   free(a2);

   }



    return 0;

}



void printContador(struct Node *a,struct Node *a2){

    int contador=0;

    struct Node *temp = a;

   struct Node *temp2= a2;

  while( temp2 != NULL){

  while ( temp != NULL){

     if (temp2->data > temp->data){

        contador++;

        temp = temp->next;

        break;

        free(temp);

free(temp2);

     }

     temp = temp->next;

  }

  temp2 = temp2->next;

}

printf("%i\n",contador);

free(temp);

free(temp2);

}

 

  • Curtir 1
Postado

Não consegui entender seu código. Não há qualquer descrição ou comentário.  Está formatado em espaço duplo e também não ajuda nada.

Parece ser uma versão pobre de uma lista ligada programada como a lista fosse um nó. Má ideia, se é que era isso.

 

Mas o enunciado é que eu não entendo... A redação é folclórica pra dizer o mínimo.

 

2 horas atrás, Gina Santos disse:

Em cada luta de personagens, vence aquele com maior pontuação de luta. Se ambos têm a mesma pontuação de luta, declara-se empate e ninguém vence

 

Wow. Então se empatar... empata. Eu já imaginava

 

2 horas atrás, Gina Santos disse:

conhecendo a pontuação de luta das suas cartas e das cartas do seu oponente, calcule o número máximo de lutas que você pode ganhar se os seus personagens forem confrontados em uma ordem apropriada

 

O que seria uma "ordem apropriada"? O que é uma "luta"?  As cartas representam personagens mas os dados são uma porcentagem?. O que é uma luta então?

 

2 horas atrás, Gina Santos disse:

Input

Em cada entrada há vários casos de teste. Cada um seguindo a forma: primeira linha contém um número que representa a quantidade de cartas de cada jogador (1 ≤ C ≤ 105). A segunda linha contém C números, que representam as pontuações de luta dos personagens do seu oponente (1 ≤ Ci ≤ 109). A terceira linha contém outros C números, que representam as pontuações de luta dos seus próprios personagens

 

Ah então a entrada consiste de conjuntos de 3 linhas... 

 

2 horas atrás, Gina Santos disse:

Output

Para cada caso de teste, imprima uma linha contendo o número máximo de lutas que você pode vencer.

 

E a saída é um número, entre 1 e 105...

 

Só que vem o exemplo1

 

2 horas atrás, Gina Santos disse:

Exemplo

Input:

7 3 87 59 42 11 17 68 20 55 9 71 4 7 81 8 99 85 95 38 42 20 20 92 73 33 52 24 83 49 40 38

Output:

5 4

 

7 3 87 59 42 11 17 68 20 55 9 71 4 7 81 8 99 85 95 38 42 20 20 92 73 33 52 24 83 49 40 38

 

Ah ok! Ou não. Que significa?

 

Podia ser talvez

 

7 
03 87 59 42 11 17 68 
20 55 09 71 04 07 81

8 
99 85 95 38 42 20 20 92 
73 33 52 24 83 49 40 38

 

Algo assim na entrada e a saída

 

5 para o primeiro e 4 para o segundo... Desde que se pudesse chegar a uma ideia de combate que levasse a tal resultado em cada um dos dois casos.

 

O exemplo 2 tem o mesmo problema...

 

O que eu perdi?

 

 

 

 

 

  • Curtir 1
  • Obrigado 2
Postado

Sim seria isso mesmo. 

Mexi no

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

void merge(int *arr, int beg, int mid, int end){
    int i=beg, j=mid+1, index=beg, *temp = malloc((end+1) *sizeof(int)), k;

    while((i<=mid) && (j<=end)){
        if(arr[i] < arr[j]){
            temp[index] = arr[i];
            i++;
        }
        else{
            temp[index] = arr[j];
            j++;
        }
        index++;
    }
    if(i>mid){
        while(j<=end){
            temp[index] = arr[j];
            j++;
            index++;
        }
    }
    else{
        while(i<=mid){
            temp[index] = arr[i];
            i++;
            index++;
        }
    }
    for(k=beg; k<index; k++)
        arr[k] = temp[k];
}
void merge_sort(int *arr, int beg, int end){
    int mid;
    if(beg<end){
        mid = (beg+end)/2;
        merge_sort(arr, beg, mid);
        merge_sort(arr, mid+1, end);
        merge(arr, beg, mid, end);
    }
}

int main(){
    int c=0;

    while (scanf("%d",&c)!=EOF){
        int *cartas1, *cartas2;
        cartas1 = malloc(c * sizeof(int));
        cartas2 = malloc(c * sizeof(int));
        int i, j, temp=0, jogos_ganhos=0;

        for(i=0; i<c; i++)
            scanf("%d", &cartas1[i]);
        for(i=0; i<c; i++)
            scanf("%d", &cartas2[i]);

        merge_sort(cartas1, 0, c-1);
        merge_sort(cartas2, 0, c-1);

        j=c-1;
        for(i=c-1; i>=0; i--){
            if(cartas2[j]>cartas1[i]){
                jogos_ganhos=jogos_ganhos+1;
                j=j-1;

            }
        }

        printf("%d\n", jogos_ganhos);
        free(certas1);
        free(certas2);

    }
    return 0;
}

só que esta dando erro tempo limite excedido no spoj. Como corrigir esse erro? No codeblocks roda normalmente. 

Postado
1 hora atrás, Gina Santos disse:

Sim seria isso mesmo

 

? Com isso mesmo eu não tinha entendido. Agora ... não entendi. O novo código também não tem uma instrução, um único comentário e parece ter os mesmos problemas do anterior.

 

Onde passa de cartas, personagens, percentagens e lutas?

 

Como chega a uma que seja das 4 respostas?

 

 

2 horas atrás, Gina Santos disse:

só que esta dando erro tempo limite excedido no spoj. Como corrigir esse erro? No codeblocks roda normalmente

 

Nem todo mundo sabe o que é spoj... Talvez pudesse qualificar essas coisas. Em geral os tempos de cpu para esses programas são bem restritivos... Com vetores tão pequenos é até estranho, mas se está cancelando deve ser mesmo por isso. Tente outros métodos para classificar o tal vetor.

 

E não precisa mesmo de int, short ou char já servem.

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!