TOPIC
PROBLEM 1281 - URI Fórum 1.0
This topic was solved and cannot recieve new replies.
-
dneto2 replied 8 years ago
Pessoal sei que ficou bem extensivo, ainda não conheço o método dos mapas de memória então fiz por alocação dinâmica criando uma espécie de string "banco de dados". Todos os resultados de teste deram certo porém o codigo não está sendo aceito.
#include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> int quantidade(char compra[]){ int i = 0, n = 0, qtd; char num[50]; while(i < strlen(compra)){ if(compra[i] == ' '){ i ++; while(compra[i] != '\0'){ num[n] = compra[i]; n ++; i ++; } } i ++; } sscanf(num, "%d", &qtd); return qtd; } double valor(char compra[],char estoque[]){ int i = 0, j = 0, cont = 0, tam = 0, n = 0; double preco; char nums[50]; while(compra[tam] != ' '){ tam ++; } do{ if(estoque[i] == compra[j]){ cont ++; } else if(estoque[i] != compra[j]){ cont = 0; j = 0; } if(cont == tam){ i += 1; while((isalpha(estoque[i]) == 0) && (estoque[i] != '\0')){ nums[n] = estoque[i]; i ++; n ++; } nums[n] = '\0'; break; } i ++; j ++; }while(estoque[i] != '\0'); sscanf(nums, "%lf", &preco); return preco; } int main(){ int n, m, qtd, cont, i, p; char produto[50], compra[50]; char *stq; double preco, total; scanf("%d", &n); for(cont = 0; cont < n; cont ++){ scanf("%d", &m); stq = (char*)malloc((m*50)*sizeof(char)); for(i = 0; i < m; i++){ if(i == 0){ fflush(stdin); gets(produto); strcpy(stq, produto); } else{ fflush(stdin); gets(produto); strcat(stq, produto); } } total = 0; scanf("%d", &p); for(i = 0; i < p; i ++){ fflush(stdin); gets(compra); qtd = quantidade(compra); preco = valor(compra, stq); total += qtd * preco; } free(stq); printf("R$ %.2lf \n", total); } return 0; }
-
mmarques1 replied 8 years ago
100% W.A alguma ideia ?
#include <iostream> #include <map> #include <stdio.h> #include <string> using namespace std; int main() { int N, A, i, j, qtt; map<string, double> mymap; map<string, double>:: iterator it; string mymap_str; double mymap_d; double total; cin >> N; for(i=0; i<N; i++) { total = 0; /* LENDO OS VALORES */ cin >> A; for(j=0; j<A; j++) { cin >> mymap_str >> mymap_d; mymap.insert(pair<string ,double>(mymap_str, mymap_d)); } /* O QUE ELA VAI COMPRAR */ cin >> A; for(j=0; j<A; j++) { cin >> mymap_str >> qtt; it = mymap.find(mymap_str); total += it->second * qtt; } /* TOTAL */ printf("R$: %.2lf\n", total); mymap.clear(); } return 0; }
-
ensbrito replied 8 years ago
Código feito em Java.
Removido!!!
Editado por Russi: Por favor não colocar a solução completa do problema.
-
tbdsouza replied 9 years ago
Dica galera: Usem map que o problema fica fácil, facilita muito o trabalho.
-
rgoncalves replied on Sep 25 2013
Ah deve ser isso mesmo! Obrigado pela dica. Agora tenho que aprender mapa, porque eu nem lembro mais kkk
-
crbonilha replied on Sep 25 2013
Não cheguei a encontrar um erro também, mas aconselho a tentar resolver esse exercício utilizando mapas (que era o objetivo de quem o escreveu).
Com mapas de memória você não precisa de um laço para percorrer e comparar posição por posição, basta fazer uma consulta, e isso diminui imensamente a complexidade da solução.
-
rgoncalves replied on Sep 20 2013
#include <iostream> #include <vector> #include <cstdio> using namespace std; typedef struct _Fruta { string nome; double preco; int quantidade; double valor; } Fruta; void ir_a_feira(); int main() { int N; cin >> N; for (int i=0; i<N; i++) ir_a_feira(); return 0; } void ir_a_feira() { vector<Fruta> v; Fruta fruta; int M; cin >> M; for (int j=0; j<M; j++) { cin >> fruta.nome >> fruta.preco; v.push_back(fruta); } int P; cin >> P; double valor_total = 0; for (int j=0; j<P; j++) { string nome; int quantidade; cin >> nome >> quantidade; for (int k=0; k<v.size(); k++) { if (v[k].nome == nome) { v[k].quantidade = quantidade; v[k].valor = v[k].quantidade * v[k].preco; valor_total += v[k].valor; break; } } } printf("R$ %.2lf\n", valor_total); }
Alguém pode me dizer o que tem de errado aqui? Testei vários casos de teste e ainda não encontrei alguma discrepância...
-
wellvolks replied on May 25 2013
Olá andelook,
O seu algoritmo funciona apenas quando N = 2, mas segundo o enunciado pode haver N, onde esse N pode ou não ser maior do que 2 =D
"A primeira linha de entrada contém um inteiro N que indica a quantidade de idas à feira de dona Parcinova (que nada mais é do que o número de casos de teste que vem a seguir). "
// imprimi apenas duas idas à feira ... System.out.println("R$ " + resultado.get(0)); System.out.println("R$ " + resultado.get(1));
Acredito que se você arrumar essa parte, pode ser que receba como resposta "Time limit exceeded", pois como N e M não são informados, pode ter algum caso que eles são grandes, como a complexidade do seu algoritmo é N*M pode ser que não passe no tempo.
-
alucateli replied on May 25 2013
public class Main { public static void main(String[] args) { ArrayList resultado = new ArrayList(); Scanner leitor = new Scanner(System.in); int ida = leitor.nextInt(); double soma = 0; double soma1 = 0; for (int i = 0; i < ida; i++) { soma = 0; String[] vet = new String[leitor.nextInt()]; leitor.nextLine(); for (int j = 0; j < vet.length; j++) { vet[j] = leitor.nextLine(); } String[] vetQuantidade = new String[leitor.nextInt()]; leitor.nextLine(); for (int j = 0; j < vetQuantidade.length; j++) { vetQuantidade[j] = leitor.nextLine(); } for (int iii = 0; iii < vetQuantidade.length; iii++) { for (int jj = 0; jj < vet.length; jj++) { String[] b = (vetQuantidade[iii].split(" ")); String[] a = (vet[jj].split(" ")); if (b[0].equals(a[0])) { soma += (Double.parseDouble(b[1])) * (Double.parseDouble((a[1]))); } } } resultado.add(soma); } System.out.println("R$ " + resultado.get(0)); System.out.println("R$ " + resultado.get(1)); } }
Ajuda qual é o problema desse código?????