Pesquisar este blog

Livros Recomendados

segunda-feira, 10 de agosto de 2020

URI - 1999 - Baile de Reconciliação - Matemática - C++

Plataforma: URI
Problema1999

Enunciado:
Todos os anos, os reinos da Cubiconia, Quadradonia e Noglônia organizam um baile para comemorar o fim da guerra que devastou a região por um longo tempo. Algum número de nobres de cada reino é convidado a participar do evento, e espera-se cada par de convidados de diferentes reinos dancem juntos exatamente uma vez. Ou seja, cada convidado de Cubiconia deve dançar uma vez com todos os convidados de Quadradonia e Noglônia, e da mesma forma a cada convidado Quadradonia deve dançar uma vez com todos Noglônia. Porém, os hóspedes de um mesmo reino nunca devem dançar juntos. Para ajudar a organizar o baile, o numero total de danças é determinado antecipadamente, então é preciso ter cuidado ao escolher o numero de convidados de cada reino. Por exemplo, se você decidir que o baile tem N = 20 danças, uma possibilidade é convidar 6 nobres de Cubiconia, 2 de Quadradonia e 1 de Noglônia, que pode ser representado pela expressão (6, 2, 1). Esta é uma opção válida, porque a quantidade total de danças seria 6 × 2 + 6 × 1 + 2 × 1 = 20. Tradições, cuja origem ninguém se lembra, indicam que o número de convidados Cubiconia deve ser maior ou igual ao número de convidados de Quadradonia, e por sua vez o número de convidados Quadradonia deve ser maior ou igual o número de convidados Noglônia. Assim, para N = 20 danças há exatamente 5 possíveis formas de escolher o número de convidados em cada reino (5, 4, 0), (4, 2, 2), (10, 2, 0), (20, 1, 0) e o acima mencionado (6, 2, 1). Com tantas restrições, o comitê organizador da cerimônia tem problemas em encontrar o número de convidados de cada reino. Sua missão é ajudar o comitê a contar as diferentes formas que os convidados podem ser escolhidos para um baile com N danças. Duas maneiras de escolher o número de convidados de cada reino são consideradas diferentes se eles diferem no número de convidados em pelo menos um dos reinos.

Linguagem: C++

Solução:
Se for feito os três for completos, o problema fica extremamente lento e dá erro no tempo limite. Então o segundo for é acelerado podendo ir até ( j = n/i ). Para verificar se uma dança é válida é feita a soma de dois em dois de i, j e k. Ao final, é impresso o valor sum, mostrando o resultado final.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
int main() {
    int n;
    cin >> n;
    while(n>=0){
     int sum = 0;
     for(int i=0;i<=n;i++){
      for(int j=0;(i>0 and j<=i and j<=n/i);j++){
       for(int k=0; k<=j;k++){
        int dancas = i*j + i*k + j*k;
        if(dancas == n){
         sum++;
        }
       }
      }
     }
     cout << sum << endl;
     cin >> n;
    }
 
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas