TOPIC

PROBLEM 1276 - URI Fórum 1.0

URI Online Judge asked 8 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • Gerson Groth replied 7 years ago

    Isso, se tiver uma linha em branco no meio, do jeito que falei vai funcionar. Basta você testar se a string está vazia ou não. Quando acabar a entrada, ele vai finalizar a execução...

  • Jonathan Lima replied 4 years ago

    meu código esta retornando 100% de erro, mas já testei inúmeros casos de teste e sempre batem...] alguém tem alguma ideia de onde posso estar errado?

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    int main() {
    
        std::string s1;
        char flag;
        int tam, i;
    
        while (true)
        {
            flag = ' ';
            getline(std::cin, s1);
            if (s1.empty())break;
    
            s1.erase(remove(s1.begin(), s1.end(), ' '), s1.end());
    
            if (s1.size() == 0)
                std::cout << "\n";
            else
            {
                sort(s1.begin(), s1.end());
                s1.erase(unique(s1.begin(), s1.end()), s1.end());
    
                tam = s1.size();
                i = 1;
    
                while (i <= tam)
                {
                    flag = s1[i - 1];
                    while ((s1[i] - s1[i - 1]) == 1) ++i;
                    if (i == tam)
                        std::cout << flag << ":" << s1[i - 1] << "\n";
                    else
                        std::cout << flag << ":" << s1[i - 1] << ", ";
                    ++i;
                }
            }
        }
    
        system("pause");
        return 0;
    }
  • Heitor Miranda replied 5 years ago

    Alguém tem alguma ideia porque o código abaixo retorna WA 40%?

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
        string str;
        map <char, char> faixas;
        char firstLetter, lastLetter;
    
        while (getline(cin, str)) {
            // remover todos espaços da string
            str.erase(remove(str.begin(), str.end(), ' '), str.end());
    
            // ordenar a string em ordem alfabética, porque o unique() só pega valores iguais que são consecutivos
            sort(str.begin(), str.end());
    
            // remover todas as letras repetidos da string
            str.erase(unique(str.begin(), str.end()), str.end());
    
            faixas.clear();
    
            for (int i = 0; i < str.length(); ++i) {
                if (i == 0) firstLetter = str[0];
    
                // caso as letras não estejam em sequência
                if (str[i] - str[i-1] > 1) {
                    faixas[firstLetter] = str[i-1];
                    firstLetter = str[i];
                }
            }
    
            // caso tenha que adicionar algo no map depois que percorri todo o for
            if (!faixas[firstLetter]) {
                faixas[firstLetter] = str[str.length()-1];
            }
    
            // caso a string não esteja vazia, imprime as faixas
            if (!str.empty()) {
    
                // int com o tamanho do map usado para ver se devo imprimir a vírgula ou não
                int sizeMap = faixas.size();
    
                for (map<char,char>::iterator it = faixas.begin(); it != faixas.end(); ++it) {
                    printf("%c:%c", it->first, it->second);
    
                    --sizeMap;
                    if (sizeMap) printf(", ");
                }
            }
    
            cout << endl;
        }
    
        return 0;
    }
  • Julia Amaral replied 5 years ago

    Pessoal, alguém pode me ajudar? Tentei resolvei esse problema e a estratégia que eu usei foi interpretar as letras como seus referentes números da tabela ascii, pra assim poder ordená-las em ordem alfabética e identificar as faixas de letras. Mas tem alguma coisa errada e eu suspeito que é no "if ((int)str2[i] == (int)str2[i+1] || (int)str2[i] == (int)str2[i+1]+1)".

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <string.h>
    
    using namespace std;
    
    int main()
    {
        int i, j;
        char str[51], str2[51], inter[27][3], aux;
        memset(str, 0, sizeof(str));
        memset(str2, 0, sizeof(str2));
        fflush(stdin);
        while ((gets(str)) != NULL)
        {
            if (strlen(str) == 1)
                printf("%c:%c\n", str[0], str[0]);
            else
            {
                j = 0;
                for (i = 0; str[i] != '\0'; i++)
                {
                    if (str[i] != ' ')
                    {
                        str2[j] = str[i];
                        j++;
                    }
    
                }
                for (i = 0; str2[i] != '\0'; i++)
                {
                    for(j = i+1; str2[j] != '\0'; j++)
                    {
                        if ((int)str2[i] > (int)str2[j])
                        {
                            aux = str2[i];
                            str2[i] = str2[j];
                            str2[j] = aux;
                        }
                    }
                }
                inter[0][0] = str2[0];
                j = 0;
                for (i = 0; str2[i] != '\0'; i++)
                {
                    if ((int)str2[i] == (int)str2[i+1] || (int)str2[i] == (int)str2[i+1]+1)
                        continue;
                    else
                    {
                        inter[j][1] = str2[i];
                        if (str2[i+1] != '\0')
                        {
                            j++;
                            inter[j][0] = str2[i+1];
                        }
                    }
                }
                for (i = 0; i <= j; i++)
                    printf("%c:%c\n", inter[i][0], inter[i][1]);
                memset(str, 0, sizeof(str));
                memset(str2, 0, sizeof(str2));
                fflush(stdin);
            }
        }
        return 0;
    }

    Obs: Sei que a saída não ta na formatação correta.

  • Lucas Correia Bernardes replied 5 years ago

    Aqui está meu código:

    Problema resolvido

    Se alguém puder me dar uma luz!

  • Matheus Leão replied 5 years ago

    Pode postar que a gente tenta ajudar :)

  • Lucas Correia Bernardes replied 6 years ago

    Alguém tem mais casos de testes para eu testar no meu algoritmo? Já testei vários e todos estão dando um resultado certo, mas quando submeto-o recebo WA (60%). Não sei mais o que fazer, é o primeiro que fico travado assim :(

    Eu posso postar meu código aqui para que vocês possam me ajudar?

  • Miguel Araújo replied 6 years ago

    Matheus Leão, valeu cara. Ajudou bastante, abraços!

  • Matheus Leão replied 6 years ago

    A ideia é printar todas as letras que aparecem. Por exemplo, no segundo caso é xyz. Mas você também deve juntar as letras por intervalo. Então xyz vira x:z (todas as letras de x a z). No primeiro caso, são dois intervalos diferentes de 1 letra, já que entre 'a' e 'h' existem várias letras que não são usadas.

  • Miguel Araújo replied 6 years ago

    Eu não entendi, exatamente, como temos essa saída:

    a partir disto:

    alguém pode me ajudar? Fiquei confuso com o enunciado. Grato desde já!

  • Rafael replied 7 years ago

    Eu não consigo descobrir qual a condição para quebrar o while, que seria quando as entradas acabarem, ja tentei o hasNext e o HasNextLine, alguém pode me ajudar? :D

    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String frase;
            char inicio, fim;
            String resposta = null;
            String Alfabeto = "ABCDEFGHIJKLMNOPQRSTUVXZ";
            String Verificador = "0000000000000000000000000";
            StringBuffer sbFrase;
    
            while (sc.hasNextLine()) {
                frase = sc.nextLine();
                frase = frase.toUpperCase();
    
                for (int i = 0; i < frase.length(); i++) {
                    for (int j = 0; j < Alfabeto.length(); j++) {
                        if (frase.charAt(i) == Alfabeto.charAt(j)) {
                            sbFrase = new StringBuffer(Verificador);
                            sbFrase.setCharAt(j, '1');
                            Verificador = sbFrase.toString();
                        }
    
                    }
    
                }
                for (int j = 0; j < Verificador.length(); j++) {
                    if (Verificador.charAt(j) == '1') {
                        inicio = Alfabeto.charAt(j);
                        fim = Alfabeto.charAt(j);
                        while (Verificador.charAt(j) == '1') {
                            fim = Alfabeto.charAt(j);
                            j++;
                        }
                        if (resposta == null) {
                            resposta = inicio + ":" + fim;
                        } else {
                            resposta = resposta + ", " + inicio + ":" + fim;
                        }
                    }
    
                }
                if(resposta!=null){
                    System.out.println(resposta.toLowerCase());
                    resposta = null;
                }
                else{
                    System.out.println();
                }
    
                Verificador = "0000000000000000000000000";
    
            }
        }
    
    }
  • Unknown replied 7 years ago

    Tirei o negócio que limpava o buffer e foi aceito...

  • Gerson Groth replied 7 years ago

    Bom, sem o código fica muito difícil dizer porque você está recebendo PE. Confira os espaços e quebras de linha, se estão exatamente iguais ao que o problema pede.

  • Unknown replied 7 years ago

    Presentation error

  • Gerson Groth replied 7 years ago

    eu usaria um getline mesmo, e apenas testaria se o tamanho da string é 0 (zero).

  • Unknown replied 7 years ago

    Como vou ler essa linha em branco? Já usei scanf, gets, fgets e getline...

  • Gerson Groth replied 7 years ago

    Favor não postar códigos completos. O fórum serve pra ajudar as pessoas que estão com alguma dificuldade no exercício e não prover uma solução completa ;). Eu não posso editar teu post nessa categoria, então favor remover o link da solução...

  • Luis Gustavo replied 7 years ago

    Entendi agora. Obrigado pois consegui :-)

    // Código removido.

  • Luis Gustavo replied 7 years ago

    Também achei que seria isso, porém o problema diz o seguinte: "Se a string for vazia, apenas imprima uma nova linha."

  • Gerson Groth replied 7 years ago

    O programa encerra quando não há mais entrada pra ler (EOF). Basicamente vc tem que ficar lendo enquanto é possível. Usando cin, seria algo do tipo:

    string linha;
    while(cin >> linha){
    ...
    }
1 of 2