Pesquisar este blog

Livros Recomendados

segunda-feira, 21 de setembro de 2020

URI - 1448 - Telefone Sem Fio - Strings - C++

Plataforma: URI
Problema1448

Enunciado:
Toda criança já brincou de "telefone sem fio". Joãozinho inventou uma variação da brincadeira. O grupo de crianças é dividido em dois times. Os times se organizam como na brincadeira original, em que cada um repete o que lhe foi falado para o seguinte, até que o último diz o que chegou até ele. No caso da brincadeira de Joãozinho será falada uma frase com n caracteres (contando letras, espaços, sinais de pontuação, etc). Todos sabem que a frase tem este comprimento. A frase é falada pelo juiz ao primeiro competidor de cada time que a repete para o segundo, e este para o terceiro e assim sucessivamente, até que o último competidor de cada time escreve a frase final (garantindo que n caracteres sejam escritos) e a entrega para o juiz. A equipe vencedora é aquela cuja frase final seja mais próxima da frase original. Para calcular a semelhança entre duas frases de mesmo comprimento você deve contar o número de vezes em que o caractere da frase do time coincide com o caractere da frase original. Ganha o time para o qual o número de coincidências seja máximo. Se os dois times empataram neste critério, a primeira vez que um dos times acertou e o outro errou decide. Exemplo: Se a frase original foi "O rato roeu a roupa do rei.", o primeiro time escreveu "O ator morreu, garoupa rei." e o segundo time escreveu "O pato moeu garoupa dorlei." O segundo time ganhou pois teve 21 coincidências contra 9 coincidências do primeiro:

Linguagem: C++

Solução:
Ao fazer a leitura das 3 linhas, elas são percorridas identificando quantas linhas de cada uma são diferentes. Além disso, é verificado quando cada uma das linhas teve seu primeiro erro. Caso as duas linhas tenha o erro na mesma posição, então essa identificação é reiniciada, buscando a próxima posição com erro.

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <map>
 
using namespace std;

int main() {
 int limit;
 string line, line1, line2;
 cin >> limit;
 getline(cin,line);
 int iteracao = 1;
 while(getline(cin,line)){
  if(iteracao==limit+1) break;
  cout << "Instancia "<< iteracao++ << endl;
  getline(cin,line1);
  getline(cin,line2);
  int errors1 = 0;
  int errors2 = 0;
  int first_error1 = line.length()+1;
  int first_error2 = line.length()+1;
  for(int i =0;i<line.length();i++){
   if(line[i]!=line1[i]){
    errors1++;
    first_error1 = first_error1 > i ? i : first_error1;
   }
   if(line[i]!=line2[i]){
    errors2++;
    first_error2 = first_error2 > i ? i : first_error2;
    if(first_error1 == first_error2){
     first_error1 = line.length()+1;
     first_error2 = line.length()+1;
    }
   }
  }
  if(errors1==errors2){
   if(first_error1 > first_error2){
    cout << "time 1"<<endl<<endl;
   } else if(first_error2 > first_error1){
    cout << "time 2"<<endl<<endl;
   } else
    cout << "empate"<<endl<<endl;
  }
  else{
   if(errors1>errors2){
    cout << "time 2"<<endl<<endl;
   } else{ // errors2>errors1
    cout << "time 1"<<endl<<endl;
   }
  }
 }
    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