TOPIC

PROBLEM 1787 - URI Fórum 1.0

URI Online Judge asked 4 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • Thalyson Nepomuceno replied 4 years ago

    Se um número é potencia de 2, então na representação binária dele só tem um 1, então tem algumas maneiras de vc verificar isso com uma linha:

    1. Utilizando a função "__builtin_popcount(n)": Retorna quantos bits setados de um inteiro
    2. Utilizando !(n & (n-1)): Pois se n for uma potencia de 2, ao subtrair um, na posição onde estaria esse 1 agora é 0. E para uma operação AND entre inteiros retornar verdade, precisa que pelo menos um bit tenha 1 nos dois inteiros. O que não vai acontecer. Por isso a negação
  • Monael replied 2 years ago

    Olá todos,

    Probleminha mal escrito e confuso hein? Essa parte do ponto extra não dá para entender. No enunciado diz claramente que é a cada rodada, mas não dá certo com o segundo exemplo, daí a forma que encontrei que fez sentido foi dar o ponto extra no final das N rodadas.

    2
    2 4 6
    3 2 16
    0

    Veja a analise do exemplo usando ponto extra por rodada:

    Primeira Rodada: U=1 R=2 I=0 Segunda Rodada: U=1 R=3 I=2

    Vence Rita, mas o exemplo afirma ser um empate. Então, passei a interpretar que o ponto extra se atribui no final das N rodadas para quem falou a maior potencia de 2. Veja a analise do exemplo de acordo com essa ideia:

    Primeira Rodada: U=1 R=1 I=0 Segunda Rodada: U=1 R=2 I=1

    A maior potencia de 2 dita foi 16, dita por I, logo: U=1 R=2 I=2. Empate!

    É isso mesmo?

    Bom, além disso, antes de submeter fiz um gerador de testes e rodei no uDebug e os milheres de testes bateram com a resposta do meu programa EXCETO essa entrada:

    5
    3427679 8 8192
    838975632 8 4096
    2 128 4
    4096 32 395260419
    397386672 598083991 1024
    0

    Bom, vamos analisar pela ideia de ponto Extra no final. Primeira rodada: U=0 R=1 I=1 Segunda rodada: U=0 R=2 I=2 Terceira rodada: U=1 R=3 I=3 Quarta rodada: U=2 R=4 I=3 Quinta rodada: U=2 R=4 I=4

    O maior número potência de 2 foi 8192, falado por I, logo U=2 R=4 I=5. Venceu Ingred, certo? Mas o uDebug afirma que venceu o jogo Rita.

    Agora vamos analisar pela ideia de dar ponto Extra a cada rodada. Primeira rodada: U=0 R=1 I=2 Segunda rodada: U=0 R=2 I=4 Terceira rodada: U=1 R=4 I=5 Quarta rodada: U=3 R=5 I=5 Quinta rodada: U=3 R=5 I=7 (ou 6 o enunciado não deixa claro se só tiver uma potência de 2 na rodada ela é a maior, eu creio que sim!)

    Enfim, seja como for Ingred vence também e não Rita como diz uDebug.

    A única forma faria Rita vencer seria numa interpretação completamente transviada do enunciado (que já está confuso mesmo, então não me surpreenderia). Seria se cada rodada desse ponto para o maior, sendo ele potencia de 2 ou não (O enunciado deixa claro que não é isso, mas vamos lá). Ficaria assim:

    Primeira rodada: U=1 R=1 I=1 Segunda rodada: U=2 R=2 I=2 Terceira rodada: U=3 R=4 I=3 Quarta rodada: U=4 R=5 I=4 Quinta rodada: U=4 R=6 I=5

    Neste caso, vence Rita, mas não creio que essa seja a forma correta de interpretar o enunciado.

    Alguém poderia averiguar o que seria o correto? Se o enunciado está correto? Se os testes estão corretos? Se o programa no uDebug está correto? Ou se minha interpretação tem algum erro?

    Obrigado

  • Jorge Gil replied 2 years ago

    Tengo 40% WA

    #include "bits/stdc++.h"
    
    using namespace std;
    #define endl '\n'
    
    bool verify2(int x){
      double y = log2(x);
      if(pow(2,y) == x) return true;
      return false;
    }
    
    int main(){
      ios_base::sync_with_stdio(false);   cin.tie(NULL);
      int N, U, R, L, P, Mx, Au, Ar, Al;
      while(cin >> N){
        Au = 0, Ar = 0, Al = 0;
        if(N == 0) break;
        for(int i=0; i<N; i++){
          cin >> U >> R >> L;
          P = max(U, max(R, L));
          if(verify2(U)){
            Au++;
            if(P == U && P != R && P != L) Au++;
          }
          if(verify2(R)){
            Ar++;
            if(P == R && P != U && P != L) Ar++;
          }
          if(verify2(L)){
            Al++;
            if(P == L && P != R && P != U) Al++;
          }
        }
        Mx = max(Au, max(Ar, Al));
        if(Au == Mx && Ar != Mx && Al != Mx) cout << "Uilton" << endl;
          else if(Ar == Mx && Au != Mx && Al != Mx) cout << "Rita" << endl;
            else if(Al == Mx && Au != Mx && Ar != Mx) cout << "Ingred" << endl;
              else cout << "URI" << endl;
      }
      return 0;
    }
  • Gleider Mackedanz replied 2 years ago

    Está dando Time limit no meu código, alguém sabe por quê?

    #include <stdio.h>
    #include <math.h>
    
    int ponto(int x){
        int p=0, i=0;
        while(pow(2,i) <= x){
    
            if(x == pow(2,i)){
                p++;
                return p;
            }
            i++;
        }
        return p;
    }
    
    int maior(int u, int r, int i){
        if((u > r) && (u > i))
            return 1;
        else if((r > u) && (r > i))
            return 2;
        else if((i > u) && (i > r))
            return 3;
        else
            return 0;
    }
    
    int main(){
        unsigned int u, r, i, n, pu, pr, pi, temp, m;
    
        scanf("%u", &n);
        while(n != 0){
            pu=0; pr=0; pi=0;
            while(n > 0){
                scanf("%u %u %u", &u, &r, &i);
                m = maior(u, r, i);
                temp = ponto(u);
                if(temp > 0){
                    pu += temp;
                    if(m == 1)
                        pu++;
                }
                temp = ponto(r);
                if(temp > 0){
                    pr += temp;
                    if(m == 2)
                        pr++;
                }
                temp = ponto(i);
                if(temp > 0){
                    pi += temp;
                    if(m == 3)
                        pi++;
                }
                n--;
            }
            if((pu > pr) && (pu > pi))
                printf("Uilton\n");
            else if((pr > pu) && (pr > pi))
                printf("Rita\n");
            else if((pi > pu) && (pi > pr))
                printf("Ingred\n");
            else
                printf("URI\n");
    
            scanf("%d", &n);
        }
    
        return 0;
    }
  • João Henrique Damazio replied 3 years ago

    #include <stdio.h>
    
    int main ()
    {
    
    unsigned long long int n, u , r , i  , j;
    
        while (scanf("%llu",&n), n != 0)
        {
    
            unsigned long long int upo = 0, rpo = 0 , ipo = 0;
    
            for (j = 0 ; j < n ; j++)
            {
    
                scanf("%llu %llu %llu",&u,&r,&i);
    
                if (!(u & (u - 1)))
                {
                    upo ++;
    
                    if(u > r && u > i)
                        upo++;
    
                }
    
                if (!(r & (r - 1)))
                {
                    rpo++;
    
                    if (r > u && r > i)
                        rpo++;
                }
    
                if (!(i & (i - 1)))
                {
                    ipo++;
    
                    if (i > u && i > r)
                        ipo++;
                }
    
            }
    
            if (upo > ipo && upo > rpo )
                printf("Uilton\n");
    
            else if (ipo > rpo && ipo > upo )
                printf("Ingred\n");
    
            else if (rpo > upo && rpo > ipo )
                printf("Rita\n");
    
            else if ( (rpo == upo && upo > ipo) || (ipo == rpo && rpo > upo) || (upo == ipo && ipo > rpo) )
                printf("URI\n");
    
        }
    
    return 0;
    }

    dá 100 wa , por que ?

  • Unknown replied 3 years ago

    Meu código está recebendo Time Limit Exceeded, alguém pode me ajudar?

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main ()
    {
        unsigned long long int N;
        while (scanf ("%llu", &N) && N!=0){
            unsigned long long int contU=0, contR=0, contI=0;
            while (N--){
                int U, R, I;
                scanf ("%llu %llu %llu", &U, &R, &I);
                int potencia (unsigned long long int x);
                contU+=potencia(U);
                contR+=potencia(R);
                contI+=potencia(I);
    
                if (contU==1){
                    if (U>R && U>I){
                        contU++;
                    }
                }
                if (contR==1){
                    if (R>U && R>I){
                        contR++;
                    }
                }
                if (contI==1){
                    if (I>U && I>R){
                        contI++;
                    }
                }
            }
            //Vencedor
    
            if (contU>contR){
                if (contU>contI){
                    printf ("Uilton\n");
                }
                if (contU==contI){
                    printf ("URI\n");
                }
                if (contU<contI){
                    printf ("Ingred\n");
                }
            }
            else if (contU==contR){
                if (contU>contI){
                    printf ("URI\n");
                }
                if (contU==contI){
                    printf ("URI\n");
                }
                if (contU<contI){
                    printf ("Ingred\n");
                }
            }
            else if (contR>contU){
                if (contR>contI){
                    printf ("Rita\n");
                }
                if (contR==contI){
                    printf ("URI\n");
                }
                if (contR<contI){
                    printf ("Ingred\n");
                }
            }
            else if (contU>contI){
                if (contU>contR){
                    printf ("Uilton\n");
                }
                if (contU==contR){
                    printf ("URI\n");
                }
                if (contU<contR){
                    printf ("Rita\n");
                }
            }
            else if (contU==contI){
                if (contU>contR){
                    printf ("URI\n");
                }
                if (contU==contR){
                    printf ("URI\n");
                }
                if (contU<contR){
                    printf ("Rita\n");
                }
            }
            else if (contI>contU){
                if (contI>contR){
                    printf ("Ingred\n");
                }
                if (contI==contR){
                    printf ("URI\n");
                }
                if (contI<contR){
                    printf ("Rita\n");
                }
            }
            else if (contI>contR){
                if (contI>contU){
                    printf ("Ingred\n");
                }
                if (contI==contU){
                    printf ("URI\n");
                }
                if (contI<contU){
                    printf ("Uilton\n");
                }
            }
            else if (contI==contR){
                if (contI<contU){
                    printf ("URI\n");
                }
                if (contI==contU){
                    printf ("URI\n");
                }
                if (contI<contU){
                    printf ("Uilton\n");
                }
            }
            else if (contR>contI){
                if (contR>contU){
                    printf ("Rita\n");
                }
                if (contR==contU){
                    printf ("URI\n");
                }
                if (contR<contU){
                    printf ("Uilton\n");
                }
            }
        }
    }
    
    int potencia (unsigned long long int x){
        double a;
        a=log(x)/log(2);
        int A=(int)a;
        if (A*1.0==a){
            return 1;
        }
        else {
            return 0;
        }
    }
  • Daniel Alves replied 3 years ago

    O meu código esta com erros para verificar o maior da rodada em alguns casos, mas não sei onde esta o erro, alguém pode me ajudar.

    #include <stdio.h>
    
    int main(){
        int n, i;
    
        while(scanf("%d", &n) != 0){
            int c1=0, c2=0, c3=0;
            int v1=0, v2=0, v3=0;
            int ui, ri, li;
            if(n == 0)
                break;
            for(i=0; i<n; i++){
                scanf("%d %d %d", &ui, &ri, &li);
                do{
                    if(ui%2 == 1 && ui > 1){
                        c1 = 0;
                        break;
                    }
                    else if(ui == 0 || ui%2 == 1)
                        break;
                    else if(ui%2 == 0){
                        ui = ui/2;
                        c1++;
                    }
                }while(ui != 0);
                do{
                    if(ri%2 == 1 && ri > 1){
                        c2 = 0;
                        break;
                    }
                    else if(ri == 0 || ri%2 == 1)
                        break;
                    else if(ri%2 == 0){
                        ri = ri/2;
                        c2++;
                    }
                }while(ri != 0);
                do{
                    if(li%2 == 1 && li > 1){
                        c3 = 0;
                        break;
                    }
                    else if(li == 0 || li%2 == 1)
                        break;
                    else if(li%2 == 0){
                        li = li/2;
                        c3++;
                    }
                }while(li != 0);
    
                if(c1 != 0) v1++;
                if(c2 != 0) v2++;
                if(c3 != 0) v3++;
    
                if(c1 != 0 && c2 != 0 && c3 == 0 && c1 > c2 && c1 > c3) v1++;
                if(c1 != 0 && c3 != 0 && c2 == 0 && c1 > c2 && c1 > c3) v1++;
    
                if(c2 != 0 && c3 != 0 && c1 == 0 && c2 > c1 && c2 > c3) v2++;
                if(c2 != 0 && c1 != 0 && c3 == 0 && c2 > c1 && c2 > c3) v2++;
    
                if(c3 != 0 && c1 != 0 && c2 == 0 && c3 > c1 && c3 > c2) v3++;
                if(c3 != 0 && c2 != 0 && c1 == 0 && c3 > c1 && c3 > c2) v3++;
            }
            if(v1 > v2 && v1 > v3)
                printf("Uilton\n");
            else if(v2 > v1 && v2 > v3)
                printf("Rita\n");
            else if(v3 > v1 && v3 > v2)
                printf("Ingred\n");
            else
                printf("URI\n");
           }
        return 0;
    }
  • José Marcos da Silva Leite replied 3 years ago

    3
    2 4 3
    3 5 6
    9 7 8
    0

    Seu código diz "URI", mas o toolkit diz "Rita".

  • Jadson José Monteiro Oliveira replied 3 years ago

    Esse é um caso de teste inválido Paulo Felipe!

  • Paulo Felipe replied 3 years ago

    Olha que estranho esse caso de teste

    2
    2 4 4
    2 4 6
    0

    Saída gerada no Toolkit

    URI
  • bjbj1991 replied 3 years ago

    i got run time error help me

    #include <iostream>
     #include <cmath>
    
     #include <string.h>
     using namespace std;
    
    int kt(int x)
     {
            int y=log(x)/log(2);
    
            if(pow(2,y)==x)
           {return 1; }
            else
            {return 0;}
    
     }
     int main(void)
     {
        int n;
        int c[100][100];
        int max1;
        while(cin >> n&&n!=0)
        {
    
            int a[3];
            int b[n];
            memset(a,0,sizeof(a));
            for(int i=0;i<n;i++)
            {
                max1=0;
                for(int j=0;j<3;j++)
                {
                    cin >> c[i][j];
                    if(max1<c[i][j])
                    {
                        max1=c[i][j];
                    }
                }
                b[i]=max1;
            }
    
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<3;j++)
                {
                if(kt(c[i][j]))
                {
                    a[j]++;
                    if(c[i][j]==b[i])
                    {
                        a[j]++;
                    }
                }
                }
            }
    cout << a[0]<<" "<<a[1];
    
         if(a[0]>a[1]&&a[0]>a[2])
            {
                cout << "Uilton" <<endl;
            }
            else if(a[1]>a[0]&&a[1]>a[2])
            {
                cout << "Rita" <<endl;
            }
            else if(a[2]>a[0]&&a[2]>a[1])
            {
                cout << "Ingred" <<endl;
            }
            else if(a[0]==a[1]||a[1]==a[2]||a[2]==a[0])
            {
                cout << "URI" <<endl;
            }
        }
            return 0;
     }
  • Doglas Wendll Sorgatto replied 3 years ago

    Lucas, você está esquecendo de verificar se o número dito é, além de potência de 2, o maior da rodada. Não encontrei essa verificação no código que postou. Faça isso e seu código vai passar.

  • Pedro Gabriel replied 4 years ago

    WA 30%, alguem pode me informar algum caso de teste que falha ?

    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    
    using namespace std ;
    
    int main (){
        int pontos[3], casos[3], numc, i, k;
        float numf ;
        int numi;
    
        scanf("%i", &numc);
    
        do{
            pontos[0]=0;
            pontos[1]=0;
            pontos[2]=0;
    
            for (k=0;k<numc; k++)
            {
                for (i=0;i<3;i++)
                {
                    scanf("%i", &casos[i]);
                }
    
                for (i=0;i<3;i++)
                {
                    numf = log2(casos[i]);
                    numi = log2(casos[i]);
                    if ( numf == numi )
                    {
                        pontos[i] ++ ;
    
                    }
                }
    
                if ( casos[0] > casos[1] && casos[0] > casos[2] && pontos[0] == 1 )
                {
                    pontos[0]++;
                }
                else if ( casos[1] > casos[0] && casos[1] > casos[2] && pontos[1] == 1 )
                {
                    pontos[1]++;
                }
                else if ( casos[2] > casos[1] && casos[2] > casos[0] && pontos[2] == 1 )
                {
                    pontos[2]++;
                }
            }
    
            if ( pontos[0] > pontos[1] && pontos[0] > pontos[2] )
            {
                printf("Uilton\n");
            }
            else if ( pontos[1] > pontos[0] && pontos[1] > pontos[2] )
            {
                printf("Rita\n");
            } 
            else if ( pontos[2] > pontos[0] && pontos[2] > pontos[1] )
            {
                printf("Ingred\n");
            }
            else if ( pontos[0] == pontos[1] or pontos[0] == pontos[2] or pontos[1] == pontos[2] )
            {
                printf("URI\n");
            }
    
            scanf ("%i", &numc);
    
            if ( numc <= 0 )
            {
                break ;
            }
    
        }while ( true );
        return 0;
    
    }
  • José Marcos da Silva Leite replied 4 years ago

    Ué,

    Mas no enunciado diz:

  • Thalyson Nepomuceno replied 4 years ago

    tentar uma uma resposta que pode ajudar pessoal de forma geral.

    Hit1: 1 não é considerado potência de 2 no problema(se bem q pelos limites, 1 não faz parte da entrada xD) Hit2: Para receber um ponto extra, tem q ter falado o maior número (e não um número maior que os outros dois)

  • Raul Sena Ferreira replied 4 years ago

    WA 20%, alguém sabe dizer o pq? Testei com várias entradas e o resultado bateu. Obrigado. resolvido

  • Lucas Savioli Scaravelli replied 4 years ago

    Estou recebendo 30% W.A, porém já testei muitos casos no toolkit e nada aparenta estar errado, alguém sabe oque pode estar errado?

    #include <stdio.h>
    #include <math.h>
    
    int main(){
    
    long long int Ui,Ri,li,N,pot;
    long long int ptsU,ptsRi,ptsli,j;
    
    long long int y,w,e;
    
    do{
    
        scanf("%lld",&N);
    
        ptsU=0;
        ptsRi=0;
        ptsli=0;
    
        if(N==0)
            break;
    
        for(j=1;j<=N;j++){
    
            scanf("%lld %lld %lld",&Ui,&Ri,&li);
    
            y=2;
            w=2;
            e=2;
    
            while(y<Ui){
    
            y*=2;
    
            }
    
            while(w<Ri){
    
            w*=2;
    
            }
    
            while(e<li){
    
            e*=2;
    
            }
    
            if(y==Ui){
               ptsU++;
            if(Ui>Ri && Ui>li)
                ptsU++;
            }
    
            if(w==Ri){
               ptsRi++;
            if(Ui<Ri && Ri>li)
                ptsRi++;
            }
    
            if(e==li){
               ptsli++;
            if(li>Ri && Ri<li)
                ptsli++;
            }
        }
    
        if(ptsU>ptsRi && ptsU>ptsli)
            printf("Uilton\n");
        else if(ptsU<ptsRi && ptsRi>ptsli)
            printf("Rita\n");
        else if(ptsU<ptsli && ptsRi<ptsli)
            printf("Ingred\n");
        else
            printf("URI\n");
    
    }while(N!=0);
    
    return 0;
    
    }
  • Ingrid Spangler replied 4 years ago

    Meu código ta dando 40% de erro, mas não sei qual o problema. Já testei vários casos e em todos o output foi correto. Também não acontece o problema do empate entre o segundo e o terceiro que já foi resolvido aqui no fórum.

    #include <stdio.h>
    #define false 0
    #define true 1
     int Is_twoPower(int x){
         while(1){
    
             if(x/2 == 0){
                 return true;
                 break;
             }
              if(x%2 == 1){
                 return false;
                 break;
             }
             x = (x/2);
         }
     }
    int main() {
    
     int n, Ui, Ri, Ii;
        while(1){
            int u = 0, r = 0, i = 0;
            scanf("%d", &n);
            if(n == 0){
                break;
            }
            for(;n>0; n--){
                scanf("%d %d %d", &Ui, &Ri, &Ii);
                u += Is_twoPower(Ui);
                r += Is_twoPower(Ri);
                i += Is_twoPower(Ii);
                if(Ri>Ii && Ri>Ui && Is_twoPower(Ri) == 1)
    r++;
                else if(u>i && u>r && Is_twoPower(Ui) == 1)
    u++;
                else if(Ii>Ri && Ii>Ui && Is_twoPower(Ii) == 1)
    i++;
            }
            if(r>i && r>u){printf("Rita\n");}
            else if(u>i && u>r){printf("Uilton\n");}
            else if(i>r && i>u){printf("Ingred\n");}
            else{printf("URI\n");}
        }
        return 0;
    }
  • Johnnes Santos replied 4 years ago

    No enunciado do exercício diz que em uma rodada os números não se repetem por isso que este caso não é válido ao toolkit. Então eu acho que esse não é o erro de fato .

  • Marcos Treviso replied 4 years ago

    Sua função de maior está errada, com a=2, b=2 e c=1. O resultado retornado é 1.

1 of 2