pesquisa

URI PROBLEMA 1288 - Canhão de Destruição SOLUÇÃO EM C

URI Online Judge | 1288

Canhão de Destruição

Por Rafael A., Lucas D. e Marlon T., URI  Brasil
Timelimit: 1
O jogo canhão de destruição é um jogo muito simples de ser entendido. Você recebeu como missão destruir um determinado castelo, sendo que o mesmo possui como característica um número inteiro R que é a sua resistência. Para tentar completar sua missão, você recebeu um canhão que é carregado com projéteis de chumbo, sendo que este canhão pode ser carregado com quantos projéteis forem possíveis desde que a soma do peso deles em quilos não exceda a capacidade de carga do canhão. Podem existir projéteis com pesos iguais e poder de destruição diferentes devido ao seu formato, embora isso não seja tão importante. Ao atingir o castelo, um projétil faz com que o seu valor de destruição seja diminuído da resistência do castelo.
Levando em consideração que o canhão pode ser carregado uma única vez, respeitando o seu limite de quilos, a sua tarefa é carregar o canhão com projéteis que não ultrapassem o seu limite de carga mas que façam o maior estrago possível, para saber se a missão foi completada ou não.

Entrada

A primeira linha de entrada contém o número de casos de teste. Cada caso de teste inicia com uma linha contendo um número inteiro N (1 ≤ N ≤ 50), que representa o número de projéteis de chumbo disponíveis. Seguem N linhas contendo dois inteiros X e Y, representando respectivamente o poder de destruição do projétil e o peso do projétil. A próxima linha contém um inteiro K (1 ≤ K ≤ 100) que representa a capacidade de carga do canhão e a última linha do caso de teste contém um inteiro R que indica a resistência total do castelo.

Saída

Se o dano total das cargas carregadas for maior ou igual à resistência do castelo então deverá ser impressa a mensagem “Missao completada com sucesso”, caso contrário, deverá ser impressa a mensagem “Falha na missao”.


#include <stdio.h>

//Nome: Canhão de Destruição

int max(int a,int b){
  if(a>b){
    return a;
  }
  else {
    return b;
  }
}

int mochila(int capacidade_max, int *peso, int *val, int n){
  int i, j;
  int capacidade_mochila[n+1][capacidade_max+1];

  for (i = 0; i <= n; i++){
      for (j = 0; j <= capacidade_max; j++){
          if (i==0 || j==0)
            capacidade_mochila[i][j] = 0;
          else if (peso[i-1] <= j){
              capacidade_mochila[i][j] = max(val[i-1] + capacidade_mochila[i-1][j-peso[i-1]],capacidade_mochila[i-1][j]);
          }
          else{
            capacidade_mochila[i][j] = capacidade_mochila[i-1][j];
          }
       }
   }

   return capacidade_mochila[n][capacidade_max];
}


int main(){
    int casos_testes;
    scanf("%d",&casos_testes);
    while(casos_testes>0){
      int n=0,k=0,r=0,i,x,y,capacidade;
      scanf("%d",&n);
      int vet_poder[n+1], vet_peso[n+1];
      for ( i = 0; i < n; i++ ){
        scanf("%d %d", &x,&y);
        vet_poder[i]=x;
        vet_peso[i]=y;
      }

      scanf("%d",&k);
      scanf("%d",&r);

      capacidade= mochila(k, vet_peso, vet_poder, n);
      if (capacidade >= r ){
        printf("Missao completada com sucesso\n");
      }else
      {
        printf("Falha na missao\n");
      }
      casos_testes--;
    }
    return 0;
}

Postar um comentário

0 Comentários