Pesquisar este blog

Livros Recomendados

quarta-feira, 17 de fevereiro de 2021

URI (BEECROWD) - 1607 - Avance as Letras - Strings - C e C++

Novidade! Resoluções para o problema Avance as Letras, um problema da categoria Strings! Costumo resolver mais os da categoria iniciante, o que abrange mais jogadores, mas gostei de fazer esse exercício e achei interessante compartilhar com vocês! Confiram as soluções e comparem. Ficaram parecidas com as de vocês? Comentem aí pra nós!!! :)

Plataforma: URI (BEECROWD)

Problema1607

Enunciado:
É dado na entrada uma string A e outra B. Em uma operação você pode escolher uma letra da primeira string e avançar esta letra. Avançar uma letra significa transformá-la na próxima letra do alfabeto, veja que a próxima letra depois de z vem a letra a novamente! Por exemplo, podemos transformar a string ab em bd em no mínimo 3 operações: ab -> bb -> bc -> bd. Podemos aplicar operações nas letras em qualquer ordem, outra possibilidade seria: ab -> ac -> bc -> bd. Dadas as duas strings, calcule o mínimo número de operações necessárias para transformar a primeira na segunda.

Linguagens: C e C++


Solução:

Código em C:

Basta percorrer a primeira string comparando o i-ésimo caractere dela com o i-ésimo caractere da segunda string. Se forem iguais nem é necessário testar, pois a distância é zero neste caso. Compara-se então se são diferentes, e aí pega-se o valor de cada uma e diminui. Pra isso é necessário ver qual é a maior, para saber se o cálculo será v2-v1 ou 26+v2-v1. Basta acumular o resultado e imprimir este acumulador.

Obs.: dessa vez deu preguiça de digitar um código pra strlen e usei a função pronta. :)

#include <stdio.h>
#include <string.h>
int main() {
    int t, ac, v1, v2, i;
    char a[10010], b[10010];
    scanf("%d", &t);
    while (t--) {
        scanf("%s %s", a, b);
        ac = 0;
        for (i = 0; i < strlen(a); i++) {
            if (a[i] != b[i]) {
                v1 = a[i];
                v2 = b[i];
                ac += (v1 < v2? v2 - v1 : 26 + v2 - v1);
            }
        }
        printf("%d\n", ac);
    }
    return 0;
}

Código em C++:

A string é percorrida verificando e acumulando a distancia entre as letras da string1 e da string2.

 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
#include <iostream>
#include <map>
 
using namespace std;

long long comp_distance(char a, char b){
 int d1, d2;
 if(a>b){
  return 'z'-a+b - 'a'+1;
 } else{
  return b-a;
 }
}
int main() {
 int n,m;
 cin >> n;
 while(n--){
  string str1, str2;
  cin >> str1 >> str2;
  long long sum =0;
  for(int pos=0;pos<str1.length();pos++){
   sum += comp_distance(str1[pos],str2[pos]);
  }
  cout << sum << endl;
 }
    return 0;
}

Solução alternativa em C++:

Aplica-se neste algoritmo a mesma lógica do código em C. Difere basicamente nas instruções de I/O (cin e cout) e no uso do tipo string, assim podendo usar direto o método size(), sem precisar de strlen.

#include <iostream>
using namespace std;
int main() {
    int t, ac, v1, v2;
    string a, b;
    cin >> t;
    while (t--) {
        cin >> a >> b;
        ac = 0;
        for (int i = 0; i < a.size(); i++) {
            if (a[i] != b[i]) {
                v1 = a[i];
                v2 = b[i];
                ac += (v1 < v2? v2 - v1 : 26 + v2 - v1);
            }
        }
        cout << ac << 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