infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Stefan Istrate din Martie 12, 2010, 20:50:45



Titlul: 821 Expresie
Scris de: Stefan Istrate din Martie 12, 2010, 20:50:45
Aici puteti discuta despre problema Expresie (http://infoarena.ro/problema/expresie).


Titlul: Răspuns: 821 Expresie
Scris de: Procopliuc Adrian din Mai 27, 2010, 20:13:51
Pentru cei care iau incorect la testele 7 si 8:
raspunsul depaseste int, declarati long long


Titlul: Răspuns: 821 Expresie
Scris de: Ilies Norbert din Martie 12, 2011, 07:46:31
iau 60 de puncte, imi da gresit si la primul test  ???
daca bag manual testele imi afiseaza bine si, bineinteles, se incadreaza si in timp  :readthis:
care ar fi problema?
http://infoarena.ro/job_detail/541993


Titlul: Răspuns: 821 Expresie
Scris de: Lepadat Mihai-Alexandru din Martie 12, 2011, 08:34:48
Nu-ti putem vedea sursa si oricum nu cred ca are cineva timp sa faca debugging. Ar fi mai bine daca ne-ai spune ideea ta de rezolvare.


Titlul: Răspuns: 821 Expresie
Scris de: Rauca Ioan David din Martie 14, 2011, 12:14:09
Ma poate ajuta cnv cu idee pentru testele 7-8...am pus long long si tot nu le iau ... ](*,)


Titlul: Răspuns: 821 Expresie
Scris de: Oancea Catalin din Martie 15, 2011, 23:44:57
Atentie cand inmultirile sunt una dupa alta! Nu pot vedea acele teste si nu iti pot vedea nici sursa.


Titlul: Răspuns: 821 Expresie
Scris de: Ilies Norbert din Martie 15, 2011, 23:56:21
testul 1 este
5
12
5
1
3
5

metoda la care m-am gandit este sa fac maximul a 3 elemente citite consecutiv si inca 2 maximuri a cate 2 elemente citite consecutiv, respectiv le retin indicii.
pt exemplul de sus ar fi max1=12*5*1 (maximul a 3 elemente) si max2=12*5 si max3=3*5( celelalte 2 maximuri).
intreb care e mai mare (max1 sau max2+max3)
pun intr-un S pe cel mai mare, si fac, cu ajutorul indicilor retinuti mai sus, elementele inmultite ale numarului mai mare egale cu 0 in vectorul in care am citit toate numerele.
daca initial este v: 12 5 1 3 5, dupa va fi v: 0 0 1 0 0
apoi fac suma.
nu prea ma  pricep sa explic, sunt si in clasa a 9a (am inceput informatica de anul asta) asa ca ... :fool:

EDIT:
Cod:
#include<fstream.h>
int a[1001];
int main()
{
int n,x,i,k1,k2,k3,k4,k5,k6,k7;
long long max1=0,max2=0,max3=0,s=0;
ifstream f("expresie.in");
ofstream g("expresie.out");
f>>n;
k1=k2=k3=k4=k5=k6=k7=0;
for (i=1;i<=n;i++)
f>>a[i];
for (i=2;i<=n-1;i++)
{
if (a[i-1]*a[i]*a[i+1]>max1)
{
max1=a[i-1]*a[i]*a[i+1];
k1=i-1;
k2=i;
k3=i+1;
}
if (a[i]>max2)
{
max3=max2;
max2=a[i];
k5=k4;
k4=i;
}
else if (a[i]>max3)
{
max3=a[i];
k5=i;
}
}
if (a[k4]*a[k4+1]>a[k4-1]*a[k4]) {max2=a[k4]*a[k4+1];k6=k4+1;}
else {max2=a[k4]*a[k4-1];k6=k4-1;}
if (a[k5]*a[k5+1]>a[k5-1]*a[k5]) {max3=a[k5]*a[k5+1];k7=k5+1;}
else {max3=a[k5]*a[k5-1];k7=k5-1;}
if (max2+max3>max1)
{
a[k4]=0;
a[k5]=0;
a[k6]=0;
a[k7]=0;
s+=max2+max3;
}
else
{
a[k1]=0;
a[k2]=0;
a[k3]=0;
s+=max1;
}
for (i=1;i<=n;i++)
s+=a[i];
g<<s;
f.close();
g.close();
return 0;
}
EDIT II:
am vazut unde buseam:D eu aflam cele mai mari 2 numere nu produsul cel mai mare a 2 numere consecutive ... mda, mersi oricum :) 80p, gresit testul 7 si 8 unde cred ca trebuie facut cu suma si produs de numere mari (in vector).


Titlul: Răspuns: 821 Expresie
Scris de: Lepadat Mihai-Alexandru din Martie 16, 2011, 08:48:50
Nu e nevoie de numere mari. Suma intra in long long.


Titlul: Răspuns: 821 Expresie
Scris de: Ilies Norbert din Martie 16, 2011, 10:38:41
trebuia sa declar vectorul cu long long  :D
eh, sunt incepator
mersi :)


Titlul: Răspuns: 821 Expresie
Scris de: Cristian Lambru din Aprilie 22, 2011, 14:29:40
Imi poate explica si mie cineva de ce trebuia declarat vectorul long long, deoarece 1...10000 intra si in int!


Titlul: Răspuns: 821 Expresie
Scris de: Andrei C. din Ianuarie 16, 2012, 13:15:41
Doar sa clarific de ce multora le merge dupa ce declara vectorul long long:

Cod:
int A[MAXN];
long long product = A[i]*A[i-1]*A[i-2];

Daca vectorul A contine valori indeajuns de mari inmultirea va face overflow si valoarea alocata lui product va fi eronata. Corect scris ar fi;

Cod:
int A[MAXN];
long long product = (long long)A[i]*(long long)A[i-1]*(long long)A[i-2];


Titlul: Răspuns: 821 Expresie
Scris de: Elena Obreja din Septembrie 11, 2012, 10:22:12
Are cineva idee de ce imi da gresit la testul 9?


Titlul: Răspuns: 821 Expresie
Scris de: Dan H Alexandru din Septembrie 11, 2012, 11:50:59
Poti sa rezolvi problema http://infoarena.ro/problema/evaluare (http://infoarena.ro/problema/evaluare) la care ai teste disponibile si apoi poti reveni la problema asta. Asa sigur iti vei da seama unde gresesti.  :ok:

Daca nici asa nu te descurci vezi ca problema s-a dat la oji deci ar trebui sa fie testele pe http://olimpiada.info (http://olimpiada.info).


Titlul: Răspuns: 821 Expresie
Scris de: Salajan Razvan din Septembrie 11, 2012, 12:02:22
Poti sa rezolvi problema http://infoarena.ro/problema/evaluare (http://infoarena.ro/problema/evaluare) la care ai teste disponibile si apoi poti reveni la problema asta. Asa sigur iti vei da seama unde gresesti.  :ok:


Care e legatura dintre cele 2 probleme?


Titlul: Răspuns: 821 Expresie
Scris de: Dan H Alexandru din Septembrie 11, 2012, 13:20:15
Pardon  :fighting:. Am citit la repezeala si , cum am vazut ca e oji , aveam impresia ca e evaluare de expresie fara paranteze. Desi nu are nici cea mai vaga legatura.  :aha:


Titlul: Răspuns: 821 Expresie
Scris de: Rapeanu George din Aprilie 17, 2016, 08:07:46
Salut.Ma poate ajuta cineva?
Am 2 surse.una in care am declarat totul cu int, si una in care am declarat totul cu long long
Cea care e cu int da 80 de puncte,cu incorect pe 7 si 8.
Dar cea cu long long imi da 0 la toate,chiar daca e exeact aceasi sursa.
Am facut o programare dinamica unde M[j]=suma maxima pana in elementul j avand folosite doar i inmultiri
Cod:
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen("expresie.in","r");
FILE *g=fopen("expresie.out","w");
long long N,i,j;
long long V[1005];
long long M[3][1005];
int main()
{
    fscanf(f,"%lld",&N);
    for(i=1;i<=N;i++)
    {
        fscanf(f,"%lld",&V);
        M[0]=M[0][i-1]+V;
        M[1]=max(M[1][i-1]+V,M[0][i-2]+V[i-1]*V);
        M[2]=max(M[2][i-1]+V,max(M[1][i-2]+V[i-1]*V,M[0][i-3]+V[i-2]*V[i-1]*V));
    }
    fprintf(g,"%lld",M[2][N]);
    fclose(f);
    fclose(g);
    return 0;
}


Titlul: Răspuns: 821 Expresie
Scris de: Alexandru Valeanu din Aprilie 17, 2016, 14:51:59
M[0][i-3] sau V[i-2] s-ar putea sa nu existe si accesezi zone din memorie intr-un mod relativ dubios (cel mai probabil intri peste alt vector si-l suprascrii).