TEMA

PROBLEM 1272 - URI Fórum 1.0

URI Online Judge preguntado 8 years ago

URI Online Judge Fórum 1.0

MOD

Este tema fue resuelto y no puede recibir nuevas respuestas.

  • Lucas Ribeiro respondido 4 years ago

    A inicialização com i==0 é necessária na situação em que o primeiro elemento da string seja uma letra, me poupando o trabalho de fazer uma condição especial para esse caso (mesmo sabendo que não seja muito certo verificar a posição i== -1 do vetor, hahaha) .

    for (int i=0; i<testes; i++){
            getline(cin, entrada);
            tam= entrada.size();
    
            for (int i=0; i<tam; i++){
                if (islower(entrada[i]) && !islower(entrada[i-1])){
                    cout<< entrada[i];
                    i++;
                }
            }

    Acredito que desta forma tenha solucionado o problema de se verificar a mesma posição duas vezes, a segunda chamada (i++) só é possível pois uma letra seguida de outra não é interessante no problema. (Por exemplo com a palavra 'oi', a letra 'i' nunca será mostrada), e talvez essa seja uma melhor forma de resolver esse exercício: "Ignorar" todas as letras seguidas até que se encontre outro espaço, concorda?

    Obs.: O tempo continua o mesmo após isso, o que reforça minha teoria que o problema-tempo do meu programa seja a função 'islower'.

    E por fim, otimizar é sensacional, até para um iniciante em C++ como eu. Abraço!

  • Unknown respondido 4 years ago

    OK... Estamos mais ou menos assim agora:

    ...
          int tamanho = entrada.size();
          for (int i=0; i<tamanho; i++){
             if (islower(entrada[i]) && !islower(entrada[i-1]))
    ...

    Na primeiro ciclo, i==0, então são analisadas entrada[0] e (não precisaria, e acho que não faz muito sentido mesmo analisar) entrada[i-1].

    No segundo ciclo, i==1. São analisadas entrada[1] e ... entrada[0] novamente.

    Ciclo 3, entrada[2] e olha aí de novo... entrada[1].

    Retrabalho muitas vezes reduz a performance. Otimizar é divertido, não é?

  • Lucas Ribeiro respondido 4 years ago

    Realmente, alterei isso e o tempo deu uma leve diminuída (0.070), mas acredito que a função 'islower' seja a responsável. Caso enxergue mais algum detalhe que possa ajudar, ficarei grato. Valeu!

  • Unknown respondido 4 years ago

    A condição de um for é testada antes de cada ciclo.

    entrada.size() muda com o tempo? É necessário chamar essa função para cada valor de i?

  • Lucas Ribeiro respondido 4 years ago

    Alguém tem alguma dica para que possa melhorar o meu código e diminuir o tempo de execução? (Está 0.072).

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main(){
        string entrada;
        int testes;
    
        cin >> testes;
        getchar();
        for (int i=0; i<testes; i++){
            getline(cin, entrada);
    
            for (int i=0; i<entrada.size(); i++){
                if (islower(entrada[i]) && !islower(entrada[i-1]))
                    cout<< entrada[i];
            }
    
            cout <<endl;
        }
        return 0;
    }
  • Lucas Santana respondido 4 years ago

    include
    int main(){
        int a,i,j,con;
        char v[50];
        scanf("%d",&a);
        for(j=0;j<a;j++){
            con=0;
            setbuf(stdin, NULL);
            scanf("%[a-z ' ']s",v);
    
            for(i=0;i<50;i++){
                if(v[i]=='\0')
                    break;
                if(v[i]==' ')
                    con=0;
                while(con==0 && v[i]!=' ')
                {
                    printf("%c",v[i]);
                    con++;
                }
    
                }
                printf("\n");
            }
    
        }
  • Unknown respondido 4 years ago

    Qual o objetivo dessa chamada de macro? Sugiro testar o código com os exemplos do exercício, e com os do uDebug. Lá você pode comparar os teus resultados com os oficiais, para identificar os possíveis bugs.

  • Felipe Derkian respondido 4 years ago

    coloquei a dica do amigo acima.. mas de 10% foi pra 40% de erro.... alguém me ajuda? todos os testes que faço esta dando certo

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        int n;
        scanf( "%d\n", &n );
        //pega quantos casos de testes;
        getchar();
        while(n--) {
    
            char msg[60];
            int i,j=0;
    //recebe a mensagem
    /*
     * eu acho que o problema é porque nao esta recebendo somente espaço e depois enter
     */
        gets(msg);
        //scanf(" %[^(\n))]s", &msg);
    
    //teste se a tem espaço e depois \0
    
           if(msg[0]==' ' && strlen(msg)==1){
            printf("\n");
            continue;
             }
    
    //corre a mensagem em busca de espaço para ver se a proximo caractere é uma letra
            for(i=0; i<strlen(msg); i++) {
    // se chegar no final da continue;
                if(msg[i+1]=='\0') {
                    continue;
    //se encontrar um espaço teste o proximo caractere para ver se é uma letra
                } else if(msg[i]==' ') {
                    if(msg[i+1]!=' ') {
                        printf("%c",msg[i+1]);
                    }
    //faz o teste para ver se a primeira letra é uma letra
                } else if(i==0) {
                    if(msg[0]!=' ') {
                        printf("%c",msg[0]);
                    }
                }
    
            }
    // faz a quebra de linha para pegar a procima mesagem e voltar no for
    
            printf("\n");
    
        }
    
    }
    MOD
  • Unknown respondido 4 years ago

    Sugestão:

    scanf( "%d\n", &n );
    ...
    fgets( msg, 100, stdin );
  • Felipe Derkian respondido 4 years ago

    alguém pode me ajudar? estou recebendo 10% de erro .. não todas as tentativas que fiz sairam certo .. mas o uri ainda esta dando erro ....

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        int n;
        scanf("%d",&n);
        //pega quantos casos de testes;
        getchar();
        while(n--) {
    
            char msg[100];
            int i,j=0;
    
        gets(msg);
    
    //corre a mensagem em busca de espaço para ver se a proximo caractere é uma letra
            for(i=0; i<strlen(msg); i++) {
    // se chegar no final da continue;
                if(msg[i+1]=='\0') {
                    continue;
    //se encontrar um espaço teste o proximo caractere para ver se é uma letra
                } else if(msg[i]==' ') {
                    if(msg[i+1]!=' ') {
                        printf("%c",msg[i+1]);
                    }
    //faz o teste para ver se a primeira letra é uma letra
                } else if(i==0) {
                    if(msg[0]!=' ') {
                        printf("%c",msg[0]);
                    }
                }
    
            }
    // faz a quebra de linha para pegar a próxima mensagem e voltar no for
    
            printf("\n");
    
        }
    
    }
    MOD
  • Unknown respondido 4 years ago

    Sim, gets não é recomendado pois não tem parâmetro que limite o tamanho do texto lido. Podemos usar o fgets, ou como você fez, cin.getline() \o/

  • COMOEUSOUBURRO respondido 4 years ago

    Código aceito, apenas modifiquei o gets pelo cin.getline(), muito obrigado pela ajuda :D.

  • COMOEUSOUBURRO respondido 4 years ago

    Sim, testei os casos e todos funcionaram, inclusive a entrada só com espaço. Muito obrigado pela ajuda, vou continuar analisando para ver o que estou fazendo de errado.

  • Unknown respondido 4 years ago

    Olá! Se o texto iniciar com um único espaço, o algoritmo map funcionará?

    Criei vários casos de testes para ajudar:

    https://www.udebug.com/URI/1272
  • COMOEUSOUBURRO respondido 4 years ago

    Pessoal, estou recebendo WA(100%), funciona para os casos testes do enunciado. Alguém poderia me ajudar, grato.

    Codigo aceito, valeu pela ajuda :D
  • Unknown respondido 4 years ago

    Já tentou assim?

    scanf("%d\n",&n);

    Ou assim?

    scanf("%d",&n);
    fflush(stdin);

    PS: Talvez você não precise disto: ||j==0

  • Augusto Victor respondido 4 years ago

    Pessoal ta dando WA(40%) se eu coloco o getchar dentro do "for" e WA(100%) quando coloco fora do "for" pode me informar o pq?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
    
        int i,j,n,trava;
        char txt[100];
        scanf("%d",&n);
                                 // se coloco aqui da WA(100%)
        for(i=0; i<n; i++)
        {
            getchar(); // se coloco aqui da WA(40%)
            gets(txt);
            for(trava=1,j=0; j<strlen(txt); j++)
            {
                if(txt[j]==' ')
                {
                    trava=1;
                }
                else if((trava==1||j==0)&&(txt[j]!=' '))
                {
                    trava=0;
                    printf("%c",txt[j]);
                }
            }
            printf("\n");
            trava=0;
        }
        return 0;
    }
  • Pedro Monteiro respondido 4 years ago

    Estou recebendo WA(100%).

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (){
        int N;
    
        scanf ("%d",&N);
    
        do {
            int i,j,aux;
            char M[51],O[51];
            M[0] = '\0';
            O[0] = '\0';
            fflush(stdin);
            scanf("%[^(\n)]s", M);
    
            for (i = 0, j = 0; M[i] != '\0'; i++){
                if (i == 0 && M[i] != ' '){
                    O[j] = M[i];
                    j++;
                }
    
                if (M[i] == ' '){
                   aux = i;
    
                   while (M[aux] == ' '){
                      aux++;
                   }
    
                   i = aux;
    
                   O[j] = M[i];
                   j++;
                }
    
                if (M[i+1] == '\0')
                   O[j] = '\0';
    
            }
    
            if (O[0] == '\0'){
                   O[0] = ' ';
                   O[1] = '\0';
            }
    
            for (j = 0; O[j] != '\0'; j++){
                printf ("%c",O[j]);
            }
    
            printf ("\n");
            N--;
        } while (N > 0);
    
        return 0;
    }
  • Enzo Vaghetti respondido 4 years ago

    ta dando 40% de erro, alguém me ajuda?

    #include<iostream>
    main()
    {
        int parada;
        bool pode=true;
        std::cin>>parada;
        std::string frase;
        for(int i=0;i<parada;i++){
            int cont=0;
            fflush(stdin);
            std::string most;
            getline(std::cin,frase);
            for(int j=0;j<frase.length();j++){
                if(frase[j]==' ' and !pode)
                    pode=true;
                if(frase[j]>='a' and frase[j]<='z' and pode){
                    most=most+frase[j];
                    cont++;
                    pode=false;
                }
            }
            std::cout<<most<<std::endl;
        }
    }
  • Erick R. Ribeiro respondido 4 years ago

    include include

    using namespace std; int main(void) { int n; cin >> n; for (int i = 0; i < n; ++i) { string linha; getline(cin, linha);

        string palavra;
        stringstream palavras (linha);
        while (palavras >> palavra){
          cout << palavra[0];
        }
        cout << endl;
    }

    }

    Implentei uma das sugestões por curiosidade, no entanto, quanto entro com a quantidade N é pulado uma linha de forma automática, alguém sabe pq?