×
Ir ao conteúdo
  • Cadastre-se

kampa896

Membro Pleno
  • Posts

    66
  • Cadastrado em

  • Última visita

  • Qualificações

    0%

Reputação

52

Informações gerais

  • Cidade e Estado
    Araçatuba/SP
  • Sexo
    Masculino
  1. @mauro_b obrigado pela dica, meu amigo. Vendo as opções do UDebug você tinha razão. Porém ainda não é essa a resposta correta. Fiz a alteração conforme sua dica, mas continua dando 5% de erro. Mas obrigado mesmo assim! from sys import stdin lista = [] total = [] igual = False for line in stdin: if line == '': break valor = line.split('\n') qtd = int(valor[0]) for i in range(qtd): valores = input().split() if valores == []: continue else: minuto = int(valores[0]) dist = int(valores[1]) media = dist / minuto lista.append(media) if max(lista) == media: if i != 0: for j in range(i): if media == lista[j]: igual = True if not igual: total.append(i+1) tam = len(total) for i in range(tam): print(total[i]) lista.clear() total.clear() igual = False
  2. Senhores, estou com uma dúvida neste exercício, 2551, do site https://www.beecrowd.com.br/judge/pt/problems/view/2551. Verifiquei alguns casos de teste pelo site https://www.udebug.com/URI/2551, que serve para depuração e todos casos são válidos. Porém o julgador online ainda dá 5% de erro. Alguém poderia ajudar? from sys import stdin lista = [] total = [] igual = False for line in stdin: if line == '': break valor = line.split('\n') qtd = int(valor[0]) for i in range(qtd): valores = input().split() minuto = int(valores[0]) dist = int(valores[1]) media = dist / minuto lista.append(media) if max(lista) == media: if i != 0: for j in range(i): if media == lista[j]: igual = True if not igual: total.append(i+1) tam = len(total) for i in range(tam): print(total[i]) lista.clear() total.clear() igual = False
  3. @Midori eu entendi, meu amigo. Mas olha que estranho. A lista 'lista1' recebe o valor da lista 'total[n]'. Ou seja, a lista 'total' é uma lista de lista. A lista 'lista1' vai receber o valor da lista 'total' de índice 'n'. Se eu colocar o valor de 10^8 como diz no enunciado do exercício, a própria plataforma da erro de limite de memória, como postei aí em cima. Além do mais, a variável 'lista1' é uma variável local, que recebe os valores do 'range' do for a qual ela pertence. Então nunca terá um valor acima do índice, entende? Por isso que não estou entendendo este erro. Mas agradeço a atenção, meu amigo.
  4. @Midori sim, simplificar a função estourará no tempo. Sim, o desafio valeu a pena, pra entender a lógica utilizada na programação dinâmica. Eu só estou com dúvida na questão da lista mesmo. Porque que está dando erro IndexError. Mas vou continuar pesquisando. Obrigado pela atenção.
  5. @Midori eu abaixei o índice porque meu computador não consegue rodar... Mas deixa eu te perguntar. No meu código o índice fica igual a "n", que tem o mesmo valor de "num1". O programa não deveria entender que está dentro dos valores? Por IndexError é quando o índice não existe na lista, não é? Eu alterei conforme você comentou e apresentou memória excedida... é um número muito alto pra ser calculado, meu notebook travou algumas vezes que insisti pro programa rodar.
  6. Pessoal, boa tarde. Devido a faculdade, comecei a aprender um pouco de Python e testar os conhecimentos em sites de programação competitiva. Estou com um problema há um tempo e não consigo localizar a solução. total = [] acess = False n_0 = 0 n_1 = 0 n_2 = 0 n_3 = 0 n_4 = 0 n_5 = 0 n_6 = 0 n_7 = 0 n_8 = 0 n_9 = 0 numeros = input() vetor = numeros.split() num1 = int(vetor[0]) num2 = int(vetor[1]) for n in range(100000): total.append([acess, n_0, n_1, n_2, n_3, n_4, n_5, n_6, n_7, n_8, n_9]) while num1 != 0 and num2 != 0: for n in range(num1, (num2 + 1)): string = str(n) lista = list(string) lista1 = total[n] if lista1[0]: continue else: tam = len(string) for i in range(tam): if lista[i] == '0': n_0 += 1 if lista[i] == '1': n_1 += 1 if lista[i] == '2': n_2 += 1 if lista[i] == '3': n_3 += 1 if lista[i] == '4': n_4 += 1 if lista[i] == '5': n_5 += 1 if lista[i] == '6': n_6 += 1 if lista[i] == '7': n_7 += 1 if lista[i] == '8': n_8 += 1 if lista[i] == '9': n_9 += 1 acess = True total.insert(n, [acess, n_0, n_1, n_2, n_3, n_4, n_5, n_6, n_7, n_8, n_9]) n_0 = 0 n_1 = 0 n_2 = 0 n_3 = 0 n_4 = 0 n_5 = 0 n_6 = 0 n_7 = 0 n_8 = 0 n_9 = 0 for n in range(1, 11): dig = 0 for i in range(num1, (num2 + 1)): a = total[i] b = int(a[n]) dig += b if n == 10: print('%d' % dig) else: print('%d ' % dig, end='') numeros = input() vetor = numeros.split() num1 = int(vetor[0]) num2 = int(vetor[1]) Na linha 27 do código, o "juiz online" acusa IndexError, porém eu não consigo entender o motivo. A linha é a seguinte: "lista1 = total[n]", que se encontra na imagem em anexo. Se alguém puder me dar uma luz, eu agradeço. O exercício encontra-se no seguinte link: https://www.beecrowd.com.br/judge/pt/problems/view/1138
  7. @devair1010 obrigado, meu amigo!
  8. Gostaria de agradecer a todos. Realmente, o uso da função recursiva excedeu o tempo de resposta do programa. Obrigado @JorgeGus, @arfneto e @devair1010. Eu não postei a fonte do problema com receio de não cumprir alguma regra do site por citar outros serviços, mas farei da próxima vez. Vocês são top.
  9. Obrigado pelas dicas, @arfneto!
  10. Senhores, boa tarde! Estou estudando a linguagem C e colocando em prática através de resoluções de diversos exercícios. Me deparei com um, de um site conhecido, e o site retornou como "tempo limite excedido". Creio que deva ser devido a resposta do programa não ser em tempo hábil, definido pelo site. Dessa forma, trata-se de otimização do código, para ser mais simples, mais eficiente. Colocarei o enunciado e o código aqui, pra ver se alguém me da uma ajuda. Já dediquei um tempo considerável nesta questão, para chegar onde cheguei e não vejo como simplificar ainda mais. Hyam é um menino que adora sequências. Ele anda descobrindo sequências interessantes que nem mesmo Fibonacci imaginaria. Certo dia, Hyam percebeu que dado um número N, ele poderia fazer uma sequência do tipo 0 1 2 2 3 3 3 4 4 4 4 ... N N N ... N. No entanto, Hyam percebeu que cada valor que aumentava no número da sequência, a quantidade total de números da sequência aumentava semelhantemente à um crescimento fatorial, neste caso, ao invés de multiplicar, soma-se o número total de números da sequência com o valor do próximo número da sequência. Por exemplo, se N = 2. A sequência correta seria 0 1 2 2, obtendo-se 4 digitos. Agora, se N = 3, o próximo número da sequência tem valor 3, então a quantidade total de número da sequência seria a quantidade de números com N = 2, que é 4, mais o valor do próximo número da sequência, neste caso 3, obtendo-se 7, já que a sequência correta para N = 3 é 0 1 2 2 3 3 3. Sua tarefa é fazer um algoritmo que dado um número inteiro N, tenha como resposta a quantidade total de números dessa sequência e logo abaixo a sequência completa. Entrada A entrada é composta de vários casos de testes. Cada caso é composto por um inteiro N (0<=N<=200) que indica o valor dos últimos N números da sequência. A entrada termina com final de arquivo (EOF). Saída A saida é no formato Caso X: N numeros onde X é a ordem do número de casos e N é a quantidade de numeros que contém na sequência completa, na próxima linha a sequência de números com um espaço entre eles. É pedido que deixe uma linha em branco após cada caso. Exemplo de EntradaExemplo de Saída 0 1 2 3 Caso 1: 1 numero 0 Caso 2: 2 numeros 0 1 Caso 3: 4 numeros0 1 2 2 #include <stdio.h> int qtd(int total); int main() { int casos = 1, numero, i, j; scanf("%d", &numero); if(numero == 0){ printf("Caso %d: %d numero\n", casos, qtd(numero)); } else{ printf("Caso %d: %d numeros\n", casos, qtd(numero)); } while(numero != EOF){ if(numero == 0){ printf("%d", numero); } else{ printf("0 "); for(i = 0; i <= numero; i++){ for(j = 0; j < i; j++){ if(j == numero){ printf("%d", i); } else{ printf("%d ", i); } } } } printf("\n\n"); casos++; scanf("%d", &numero); if(numero == 0){ printf("Caso %d: %d numero\n", casos, qtd(numero)); } else{ printf("Caso %d: %d numeros\n", casos, qtd(numero)); } } return 0; } int qtd(int total){ if(total == 0){ return 1; } return total + qtd(total - 1); } Caso 4: 7 numeros 0 1 2 2 3 3 3
  11. Gostaria de agradecer a todos, @arfneto, @devair1010 e @Midori. Estou com um problema parecido com o do meu amigo que criou o tópico. Pelas explicações, deve ser a mesma faculdade... E consegui entender e resolver o problema.
  12. Não estou desmerecendo os tutores da faculdade, longe de mim julgar o conhecimento de alguém, mas a didática de vocês está me ensinando muito mais. Obrigado a todos, meus amigos. @arfneto e @codigo rápido. Entendi agora. Quando estudei algoritmos e lógica de programação, mesmo usando C, não tive ponteiros. E o professor desta vez não conseguiu explicar da forma que vocês fizeram, e eles não entendiam a minha dúvida. Agora ficou claro que argumentos em C, em uma função, não quer dizer que precisa ser parâmetro de entrada. Obrigado mais uma vez!
  13. @codigo rápido tive algoritmo e lógica de programação em C e portugol. Mas não tinha visto ponteiros ainda. E o professor não conseguiu explicar da forma que você disse, simples. Obrigado! Testei em um compilador online e deu alguns erros. Quando chegar em casa vou testar na IDE, obrigado!
  14. Bom dia, pessoal. Estou com uma dúvida em uma questão da faculdade e a tutoria não está conseguindo me ajudar. Vou postar aqui com meus questionamentos e apontamentos do professor, pra ver se alguém consegue me explicar de uma outra forma. A questão está em anexo. A minha dúvida foi a seguinte: "Boa tarde, professor. Na atividade prática, a prática 3 pede para que seja executado um programa que calcula a área e o perímetro de um hexágono. E já pede que uma função siga um determinado protótipo. Porém, como parâmetro de entrada da função pré-determinada, já temos a própria área e perímetro como parâmetro de entrada. Não seria a função que teria que calcular esses valores? E o único parâmetro de entrada seria o lado do hexágono?" A primeira resposta do tutor: "Boa Tarde! Verifique que o perimetro e a área são passados por referência. Isso permite que a função retorne os dois valores calculados. Dessa forma estão correto os parâmetros. Bons Estudos;" E eu continuei sem entender: "Professor, boa tarde. Eu entendi que o perímetro e a área são passados por referência. Mas a minha dúvida é a seguinte. O exercício pede que a função calcule o perímetro e a área. Se esses duas informações, já são passadas pra função como parâmetros de entrada, mesmo que por referência, não é a função que calcula, a função ou imprimi ou faz outra coisa com essas informações. Se a função deve receber apenas o lado, como diz no enunciado, seria apenas o lado como parâmetro de entrada. A função que deveria retornar os valores do perímetro e da área, e não receber como parâmetros de entrada. O senhor conseguiu entender a minha dúvida? O protótipo da função deveria receber apenas o lado como parâmetro de entrada, pra poder retornar a área e o perímetro. Mas se a área e o perímetro são parâmetros de entrada, mesmo que através de ponteiros, essas duas informações são calculadas fora da função, em outra parte do programa. Como a função calcularia essas duas informações, se elas já são usadas como valores de entrada?" E a segunda resposta, ainda sem entender... Compreendi sua dúvida. A função deve somente calcular a área e o perímetro e atribuir as variáveis passadas por referência. A função é do tipo void ela não tem retorno pelo comando return devido ao tipo. Não deve-se interpretar que as variáveis passadas são parametros de entrada. Elas são os argumentos da função. A função scanf() funciona da mesma maneira você informa o endereço da variável que irá receber a entrada do usuário. O calculo ocorre de forma simples. Você indica que deseja alterar o conteúdo do ponteiro e atribui o valor desejado. Qualquer dúvida, estou à disposição. Bons Estudos;" Desta forma, respondi novamente, com um exemplo de código: Professor, boa noite. Eu vou assistir a aula online se eu conseguir sair a tempo do trabalho, e vejo se o senhor pode me ajudar. Porque eu ainda não estou entendendo a questão. O protótipo da função, pede três argumentos, correto? Uma variável tipo float 'l' e dois ponteiros, '*area' e '*perimetro'. Esses argumentos são colocados na função no momento que chamamos ela no programa principal, no 'int main()'. Os argumentos são de entrada, são utilizados para chamar a função no programa. Independente se serão utilizados valores ou referência, eles são colocados na função. O senhor disse na explicação: "A função scanf() funciona da mesma maneira você informa o endereço da variável que irá receber a entrada do usuário". É exatamente isso que estou perguntando. O scanf informa o endereço da variável que receber de entrada. Ou seja, se o argumento da função já pede três argumentos (lado, *area e *perimetro), independentes se são valores ou referência, depende da entrada que receber do usuário. Ou seja, o programa não calcula, já que pede inicialmente a entrada do usuário. Entendi que a função é void, não oferece retorno. Mas não entendi como a função pede três argumentos de entrada para chamar a função, sendo que dois deles deveria ser a própria função a calcular. Vou postar um código para o senhor ver, para tentar explicar mais uma vez a minha dúvida." #include <stdio.h> #include <math.h> void calc_hexa(float la); int main() { float lado; printf("Digite o lado do hexágono: "); scanf("%f", &lado); while(lado > 0){ calc_hexa(lado); printf("Digite o lado do hexágono: "); scanf("%f", &lado); } return 0; } void calc_hexa(float la){ float a = (3 * la * la * sqrt(3))/2; float p = 6 * la; printf("%.2f %.2f\n", a, p); } Se o programa tem que calcular a área e o perímetro, eles não podem estar nos argumentos da função, entendeu? Porque esses argumentos da função, ou o usuário tem que fornecer de entrada, ou tem que ter sido calculado em outra parte do programa, para ser usado como valor ou como referência. A função não pode ter em seus argumentos um dado que ela mesma tem que calcular. É essa a minha dúvida.
  15. @arfneto entendi, meu amigo. Agora a recursão ficou mais clara e consegui rodar o código. Vou procurar esse conteúdo de CSV que mencionou. Vai me ajudar demais a aprender a trabalhar com arquivos e arquivo CSV em linguagem C. Obrigado pela atenção de sempre.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!