infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din Mai 26, 2009, 21:49:45



Titlul: 823 Reteta2
Scris de: Adrian Diaconu din Mai 26, 2009, 21:49:45
Aici puteţi discuta despre problema Reteta2 (http://infoarena.ro/problema/reteta2).


Titlul: Răspuns: 823 Reteta2
Scris de: Florian Marcu din Mai 27, 2009, 11:29:00
S-au pastrat testele de la OJI? Pentru ca iau 10 puncte pe problema asta, iar toate cele 10 teste de la OJI imi merg perfect. Ceva idei unde as putea gresi?   :-k


Titlul: Răspuns: 823 Reteta2
Scris de: Ionescu Vlad din Mai 27, 2009, 13:01:27
Daca citesti cu gets / fgets vezi ce se intampla cand ai si cand nu ai '\n' la sfarsitul liniei.


Titlul: Răspuns: 823 Reteta2
Scris de: Florian Marcu din Mai 27, 2009, 14:08:15
Initial citeam caracter cu caracter, si intr-adevar, cand nu aveam '\n' la sfarsit, imi dadea incorect. Am facut apoi citirea cu fgets, si se comporta cum trebuie pe ambele cazuri ( si cu "\n", si fara ). Problema este ca iau tot 10 puncte, si deja devine enervanta, intrucat pe absolut toate testele de la OJI imi da bine. Iau chiar si KBS pe cateva teste(cand trimit pe ia). Memoria nu o depasesc, nu apelez zone nealocate, numele fisierelor de .in/.out sunt corecte. Nu pot sa-mi dau seama ce are. Cei care au facut`o de 100, cum ati facut citirea?  ](*,)


Titlul: Răspuns: 823 Reteta2
Scris de: Ionescu Vlad din Mai 27, 2009, 15:03:03
Nu stiu exact cum faci, dar windows trece cu vederea unele erori aparent neimportante din partea programatorului. De exemplu, ti se cere sa afisezi produsele sortate. Banuiesc ca parcurgi o data sirul si le copiezi pe toate intr-o matrice. Cand termini de copiat cuvantul, ai grija sa pui '\0' la sfarsit (asta nu stiu daca chiar conteaza, dar e bine de facut oricum). Vezi sa declari vectorii folositi putin mai mari decat ai nevoie in cazul sirurilor de caractere, ca sa poti retine si caracterele '\n' si '\0'; asta este o posibila cauza de eroare care apare pe linux dar pe windows nu intotdeauna. Ai grija sa nu fie ceva la sortare tot de genul acesta.

Eu am luat 100 avand grija sa citesc cu fgets, sa nu ma intereseze de '\n', sa declar vectorii de dimensiuni mai mari si sa pun '\0'.

Apropo, nu se acorda punctaje partiale asa cum scrie in enunt.


Titlul: Răspuns: 823 Reteta2
Scris de: George Popoiu din Ianuarie 17, 2010, 15:48:54
Iau 0 puncte cu Killed by signal 11 si nu inteleg de ce, pt ca pe testele de la oji imi determina toti timpii totali de preparare corect.
Nu reusesc sa-mi dau seama ce anume din codul urmator poate sa dea killed by signal 11.

Cod:
void CalcTimpTotal()
{
int timp=0;
bool gasit;
char *p;
char *ant;
ant=cp; //char cp[Max]; este sirul meu
do
    {
    gasit=false;
    *p=NULL;
    p=strchr(ant,')');// caut pozitia primului caracter ')' in sirul ramas
    if(p!=NULL)//daca am gasit
        {
        gasit=true;
        timp+=atol(p+1);//transform ce este in dreapta paratezei in numar, daca am ") 23s"  si eu transform de la pointerul p+1 atunci va transforma " 23s" si va returna numarul 23
        ant=p+1;//restrang sirul la ce mai ramane in dreapta
        }
    }
while(gasit);
g<<timp;
}

De la ce credeti ca ar putea fi?
Vectorul cp are dimensiunea 1010, deci nu e de la asta.


Titlul: Răspuns: 823 Reteta2
Scris de: A Cosmina - vechi din Ianuarie 17, 2010, 16:36:44
Poate se incurca in pointeri ?

Eu am facut cu strtok() din string.h . Succes ! ;)


Titlul: Răspuns: 823 Reteta2
Scris de: alexandru din Ianuarie 17, 2010, 17:08:53
De la *p=NULL  ori pui p=NULL ori nu pui nimic :)


Titlul: Răspuns: 823 Reteta2
Scris de: George Popoiu din Ianuarie 17, 2010, 17:59:48
@alexandru

Da, era de la *p=NULL, thx.

@miculprogramator

Am facut sa vad doar daca primesc punctaj pentru timpul corect (dar se pare ca nu ofera 30% din punctaj doar pentru durata corecta). Ca sa rezolv cerinta integral o sa folosesc strtok  :wink:


Titlul: Răspuns: 823 Reteta2
Scris de: Neagoe Alexandru din Ianuarie 17, 2010, 22:21:31
       Daca vrea cineva sa se uite si pe sursa mea, ca ma chinui de cateva ore si nu imi dau seama de ce iau numai 20 puncte. Pe testele de la OJI da bine si nu am nicio idee ce ar fi gresit. Va multumesc anticipat  :D.


Titlul: Răspuns: 823 Reteta2
Scris de: alexandru din Ianuarie 18, 2010, 06:33:01
      Daca vrea cineva sa se uite si pe sursa mea, ca ma chinui de cateva ore si nu imi dau seama de ce iau numai 20 puncte. Pe testele de la OJI da bine si nu am nicio idee ce ar fi gresit. Va multumesc anticipat  :D.
Numai moderatori si tu pot vedea sursa ta, ai putea posta o bucata de cod aici :)


Titlul: Răspuns: 823 Reteta2
Scris de: Neagoe Alexandru din Ianuarie 18, 2010, 10:59:49
Numai moderatori si tu pot vedea sursa ta, ai putea posta o bucata de cod aici :)

     Stiu asta, dar daca vrea cineva pot da PM cu sursa :). O bucata din cod nu cred ca ar ajuta, din moment ce eu nu stiu unde e greseala.


Titlul: Răspuns: 823 Reteta2
Scris de: Paul-Dan Baltescu din Ianuarie 19, 2010, 03:06:44
A fost adaugat un evaluator problemei si acum se primesc punctaje partiale dupa cum este precizat in enunt. Problema a fost reevaluata.


Titlul: Răspuns: 823 Reteta2
Scris de: Dragos Dumitrescu din Martie 08, 2010, 01:53:12
Cod:
Test 	Timp executie 	Memorie folosita 	Mesaj 	Punctaj/test
1 0ms 8kb OK! 10
2 4ms 8kb OK! 10
3 4ms 8kb OK! 10
4 4ms 8kb Afisarea Ingredientelor gresita 3
5 4ms 12kb OK! 10
6 0ms 8kb OK! 10
7 0ms 12kb OK! 10
8 0ms 8kb OK! 10
9 4ms 8kb OK! 10
10 0ms 12kb OK! 10
Punctaj total 93

Mah poate ajuta cineva cu o idee ? Nu imi dau seama peste ce caz particular as putea sari!


Titlul: Răspuns: 823 Reteta2
Scris de: Simoiu Robert din Martie 08, 2010, 12:09:17
Pai daca nu ne dai indicii cum ai facut ... oricum ia testele de la OJI si incearca testul care tii gresit (vezi ca se incepe de la 0, deci testul tau e numarul 3).


Titlul: Răspuns: 823 Reteta2
Scris de: Macarescu Sebastian din Mai 24, 2010, 13:09:17
Mi se pare ca enuntul e gresit. Aici cred
Citat
1 ≤ Numărul de ingrediente ≤ 100
nu e bun. Eu am pus limita la vectorul de ingrediente de 101 si imi da gresit la testele 4 si 6. Am marit limita la 170 de elemente si am luat 100 pt. La testul 6 sunt 106 de ingrediente si la testul 4 sunt 166. Nu sunt sigur daca asa e, poate am inteles eu gresit enuntul.


Titlul: Răspuns: 823 Reteta2
Scris de: Simoiu Robert din Mai 24, 2010, 16:15:18
Nu pune niciodata vectoru foarte apropiat , pune si tu 105, si ai sa vezi ca iti merge.


Titlul: Răspuns: 823 Reteta2
Scris de: Junc Raul Cosmin din Martie 17, 2011, 01:38:39
Ii ceva ciudat... Eu am verificat cu toate testele oficiale si am vazut ca la toate imi da bine... Iar aici... Primesc doar 44 de pc... Doar la testul 1 si 4 sunt bune ingredientele si la toate timpul de amestecare ii bun.
Imi poate da cineva cateva teste folosite aici?
Multzumesc pt timpul acordat  :ok:


Titlul: Răspuns: 823 Reteta2
Scris de: Sorin Rita din Martie 17, 2011, 02:03:03
Cel mai probabil nu o sa primesti vreun test. Dar vezi ca,de obicei, se folosesc aceleasi teste ca la OJI si cred ca la fel s-a procedat si la problema asta.


Titlul: Răspuns: 823 Reteta2
Scris de: Mihai Visuian din Decembrie 20, 2011, 09:03:36
Care ocupa mai multa memorie ? stringurile sau charurile?


Titlul: Răspuns: 823 Reteta2
Scris de: Savin Tiberiu din Decembrie 20, 2011, 13:57:35
Stringurile sunt vectori de charuri, deci nu prea are sens intrebarea ta. Ca si cum ai intreba ce ocupa mai mult, 1 char sau 2 charuri?


Titlul: Răspuns: 823 Reteta2
Scris de: Mihai Visuian din Februarie 29, 2012, 10:26:24
Iau KBS pe testele 8 si 10 si nu stiu de ce. Am declarat sirul de 1010 si structura de ingrediente de 106. Imi puteti spune ce pot face ca sa scap de KBS?


Titlul: Răspuns: 823 Reteta2
Scris de: FMI Razvan Birisan din Septembrie 22, 2012, 11:46:41
Citat
Fişierul de ieşire reteta2.out va conţine pe prima linie timpul total necesar pentru prepararea reţetei. Pe următoarele linii sunt scrise ingredientele în ordine lexicografică (ordinea din dicţionar)

Rețeta poate conține și două ingrediente care să înceapă cu aceeași literă ?  :-k

Ex.
cacao
cafea



Titlul: Răspuns: 823 Reteta2
Scris de: Gabriel Bitis din Septembrie 22, 2012, 12:05:24
Desigur.


Titlul: Răspuns: 823 Reteta2
Scris de: Alexandru Valeanu din Februarie 03, 2013, 16:44:25
Imi poate spune si mie cineva de ce imi spune ca afisez ingredientele incorect...pe testele oficiale merge perfect...mie ca e ceva ce tine de afisare nu de rezolvare...dar nu-mi dau seama cea...

Cod:
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
using namespace std;
 
char s[1005];
char a[1005];
int l=0;
 
ifstream f("reteta2.in");
ofstream g("reteta2.out");
 
struct retetar{
 
    char nume[1000];
    int nr;
};
 
retetar v[1005];
 
void citire(){
 
    f.getline(s,1000);
 
    f.close();
 
}
 
void pune(char c[],int x){
 
    int t=1;
 
    for(int i=1;i<=l;i++){
 
        if(strcmp(v[i].nume,c)==0){
            v[i].nr+=x;
            t=0;
            break;
        }
    }
 
    if(t){
        l++;
        strcpy(v[l].nume,c);
        v[l].nr=x;
    }
}
 
void sortare(){
 
    int gata,i;
    char x[30];
    int aux;
 
    do{
 
        gata=0;
 
        for(i=1;i<l;i++)
 
            if(strcmp(v[i].nume,v[i+1].nume)==1){
 
                strcpy(x,v[i].nume);
                strcpy(v[i].nume,v[i+1].nume);
                strcpy(v[i+1].nume,x);
 
                aux=v[i].nr;
                v[i].nr=v[i+1].nr;
                v[i+1].nr=aux;
 
                gata=1;
            }
 
    }while(gata);
}
 
 
int main()
{
    citire();
 
    int i=1,nr,suma=0;
 
    strcpy(a,s);
 
    while(i<strlen(s))
        if(isspace(s[i]))
            strcpy(s+i,s+i+1);
        else
            i++;
    i=0;
 
    while(i<strlen(s)){
 
        nr=0;
 
        if(isdigit(s[i]) && s[i-1]==')')
            while(isdigit(s[i])){
                nr=nr*10 + s[i]-48;
                i++;
            }
 
        suma+=nr;
 
        i++;
    }
 
    i=0;
 
    while(i<strlen(s)){
 
        if(isdigit(s[i]) && s[i-1]==')' )
            while(isdigit(s[i])){
                strcpy(s+i,s+i+1);
            }
 
        i++;
    }
 
    i=0;
 
    while(i<strlen(s))
        if(s[i]<48)
            strcpy(s+i,s+i+1);
        else
            i++;
 
    i=0;
 
    while(i<strlen(s)){
 
        nr=0;
        char c[30];
        int k=0;
 
        while(isalpha(s[i]))
            c[k++]=s[i++];
 
 
        if(isdigit(s[i]))
            while(isdigit(s[i])){
                nr=nr*10 + s[i]-48;
                i++;
            }
 
        c[k]='\0';
 
        pune(c,nr);
 
    }
 
    sortare();
 
    g<<suma<<endl;
 
    for(int i=1;i<=l;i++){
 
        g<<v[i].nume<<" "<<v[i].nr<<endl;
 
    }
 
    g.close();
 
    return 0;
}


Titlul: Răspuns: 823 Reteta2
Scris de: Salajan Razvan din Februarie 04, 2013, 16:05:47
Esti sigur?!(ca merge perfect pe toate). Am schimbat endl cu "\n" si sursa ta a luat 44 de pct : http://infoarena.ro/job_detail/871176. Si in viitor foloseste "\n" in loc de endl.


Titlul: Răspuns: 823 Reteta2
Scris de: Alexandru Valeanu din Februarie 04, 2013, 21:46:41
Pe testele oficiale mie mi-a mers perfect...si nu, nu se schimba nimic la punctaj cu "\n"


Titlul: Răspuns: 823 Reteta2
Scris de: CHIRILA ADRIAN din Decembrie 01, 2013, 14:28:49
Am implementat containerul map din Stl.Unde am avut ca si cheie numele ingredientului si valoarea asociata cheii cantitatea lui.Am executat operatii de inserare si cautare pe acel map.Chiar atat de rau se comporta containerul incat sa obtin 0 puncte?(TIME LIMIT EXCEEDED)


Titlul: Răspuns: 823 Reteta2
Scris de: Mocanu George din Decembrie 14, 2013, 19:51:18
Testele nu sunt aceleasi ca si la OJI? Pe sursa sursa:http://www.infoarena.ro/job_detail/1057834?action=view-source (http://www.infoarena.ro/job_detail/1057834?action=view-source) iau 44 de puncte deoarece "nu afisez ingredientele corect", desi ruland sursa pe testele de la OJI nu vad nici o diferenta intre out si ok.


Titlul: Răspuns: 823 Reteta2
Scris de: Muntea Andrei din Martie 18, 2014, 18:11:50
Este gresita restrictia cu "numarul de ingrediente <100" . Daca declar vectorul meu de 102 elemente iau 90 puncte (Killed by signal) la un test. Daca i-am dat 1002 am luat 100 puncte :yahoo: va rog sa modificati

L.E: nu conteaza. eu luam elementele separat dupa care le sortam. Oricum mi-a dat ceva batai de cap restrictia aia :oops:


Titlul: Răspuns: 823 Reteta2
Scris de: Sopterean Adrian din Ianuarie 24, 2016, 01:39:41
nu inteleg ce am facut gresit... pe testele de la oji imi arata totul cum trebuie, insa cand pun codul pe site primesc doar 6 puncte.
daca poate sa ma ajute cineva, acesta e codul:

#include <fstream>
#include <string.h>
#include <stdlib.h>
using namespace std;
ifstream fin("reteta2.in");
ofstream fout("reteta2.out");
int n,sum,k,z,j,i,q;
struct
{
    char nume[1000];
    int g;
} ing[200];
char nr[1005];
void suma(char s[1005])
{
    while(i<strlen(s))
    {
        if(strchr(" ",s))
            strcpy(s+i,s+i+1);
        else ++i;
    }
    i=0;
    while(i<strlen(s))
    {
        if(strchr(")",s))
        {
            strcpy(s+i,s+i+1);
            while(s>='0' and s<='9')
            {
                strncat(nr,s+i,1);
                strcpy(s+i,s+i+1);
            }
            sum+=atoi(nr);
            strcpy(nr,"");
        }
        else ++i;
    }
}
void produse(char s[1005])
{
    for(i=0; i<strlen(s); ++i)
    {
        if(s>='a' and s<='z')
        {
            ++j;
            while(s>='a' and s<='z')
            {
                strncat(ing[j].nume,s+i,1);
                ++i;
            }
        }

    }
    j=0;
    for(i=0; i<strlen(s); ++i)
    {
        if(s>='0' and s<='9')
        {
            ++j;
            while(s>='0' and s<='9')
            {
                strncat(nr,s+i,1);
                ++i;
            }
            ing[j].g=atoi(nr);
            strcpy(nr,"");
        }

    }
}
void adunare(char s[1005])
{
    for(i=1;i<=j;++i)
    {
        for(k=1;k<=j;++k)
        {
            while(i!=k and strcmp(ing.nume,ing[k].nume)==0)
            {
                ing.g+=ing[k].g;
                for(q=k; q<=j; ++q)
                {
                    strcpy(ing[q].nume,ing[q+1].nume);
                    ing[q].g=ing[q+1].g;

                }
                --j;
            }
        }
    }
}
void sortare(char s[1005])
{
    int ok=1,aux;
    i=0;
    while(ok)
    {
        ok=0;
        i=1;
        while(i<j)
        {
            if(strcmp(ing.nume,ing[i+1].nume)==1)
            {
                ok=1;
                strcpy(nr,ing.nume);
                strcpy(ing.nume,ing[i+1].nume);
                strcpy(ing[i+1].nume,nr);
                aux=ing.g;
                ing.g=ing[i+1].g;
                ing[i+1].g=aux;
            }
            else ++i;
        }
    }
}
void afisare(char s[1005])
{
    fout<<sum<<'\n';
    for(i=1; i<=j; ++i)
        fout<<ing.nume<<" "<<ing.g<<'\n';
}
int main()
{
    char s[1005];
    fin.getline(s,1005);
    suma(s);
    produse(s);
    adunare(s);
    sortare(s);
    afisare(s);
}


Titlul: Răspuns: 823 Reteta2
Scris de: Mihalut Filip din Martie 09, 2016, 18:03:06
Testele date nu respecta restrictiile :x


Titlul: Răspuns: 823 Reteta2
Scris de: Alin Pisica din Martie 11, 2016, 13:13:29
Pe alt site (asemanator infoarena, nu dau nume pentru a evita reclama) iau 100 de puncte, cu aceeasi sursa postata aici. In evaluatorul de la OJI am luat 100 de puncte. Faza e ca aici nu trece de 0 puncte.
Da, am verificat numele fisierelor de intrare si de iesire si sunt corecte. Care e problema?!