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)
Problema: 1607
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