Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 003 Bursa  (Citit de 25449 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« : Februarie 21, 2012, 14:37:21 »

Aici puteţi discuta despre problema Bursa.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
a_h1926
Echipa infoarena
Nu mai tace
*****

Karma: 317
Deconectat Deconectat

Mesaje: 385



Vezi Profilul
« Răspunde #1 : Februarie 21, 2012, 21:58:33 »

As vrea sa va rog, daca ma poate ajuta cineva la problema Bursa. Am gasit o solutie cu programare dinamica, dar care obtine numai 80 de puncte. Am incercat si solutia greedy si obtin numai 30 de puncte. Va rog sa va uitati peste sursa mea, sa vedeti ce greseti, pentru ca nu imi dau seama. Va multumesc.

Cod:
#include <cstdio>

#define LL long long
#define NMax 100005
#define Infinity 1000000000

using namespace std;

int N;
LL P[NMax], S, InitS, A;

void Solve ()
{
    P[0]=Infinity; // Prima zi dar nu poate fi maxim local, dar poate fi minim local
    P[N+1]=0; // Ultima zi nu poate fi minim local, dar poate fi maxim local
    for (int i=1; i<=N; ++i)
    {
        if (P[i-1]>P[i] and P[i]<P[i+1]) // Ziua i este minim local
        {
            A+=(S/P[i]); S%=P[i]; // Cumpar cat de multe actiuni pot, si imi ramane o parte din suma detinuta initial
        }
        if (P[i-1]<P[i] and P[i]>P[i+1]) // Ziua i este maxim local
        {
            S+=(A*P[i]); A=0; // Vand toate actiunile pe care le detin
        }
    }
}

void Read ()
{
    freopen ("bursa.in", "r", stdin);
    scanf ("%d %lld", &N, &InitS); S=InitS; // Pornesc cu suma initiala de bani
    for (int i=1; i<=N; ++i)
    {
        scanf ("%lld", &P[i]); // Citesc preturile fiecare actiuni
    }
}

void Print ()
{
    freopen ("bursa.out", "w", stdout);
    printf ("%lld\n", S-InitS); // Afisez suma detinuta in ziua N-suma initiala (profitul)
}

int main()
{
    Read ();
    Solve ();
    Print ();
    return 0;
}
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #2 : Februarie 21, 2012, 22:08:28 »

Poate te ajuta daca te uiti la cazuri in care trebuie sa pui si egal in loc de mai mare sau mai mic strict.
Memorat
flaviusc11
Strain
*

Karma: 1
Deconectat Deconectat

Mesaje: 26



Vezi Profilul
« Răspunde #3 : Februarie 21, 2012, 23:22:29 »

Poate ma lamureste si pe mine cineva cu ce gresesc in algoritmul urmator. Merge pe 6 teste din cele 10. Ideea algoritmului este de a afla toate subsecventele crescatoare din sir. Daca gasesc o subsecventa crescatoare in sir, atunci cumpar cat pot de multe actiuni la inceputul subsirului crescator, si le vand pe toate (actiunile) la sfarsitul subsirului.

Cod:
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
    int i, x, n;
    long long s,s_init,s_rest=0;

    freopen( "bursa.in", "r", stdin );
    freopen( "bursa.out", "w", stdout );

    scanf("%d", &n );
    scanf("%lld",&s);
    s_init=s;
    vector<int>v;
    vector<int>::iterator it;
    for( i = 0; i < n; i++ )
        scanf("%d", &x), v.push_back( x );
    i=0;
    while(i<n) 
    {
        int p=i;                                //retin indicele subsecventei
            while( (i<n-1) && (v[i]<=v[i+1]))   //cat timp subsecventa este crescatoare inaintez in vector
            {
                i=i+1;
            }

        if(p!=i)                          //daca exista subsecventa crescatoare atunci cumpar cat pot de multe actiuni la inceputul subsecventei
          {                               // si le vand pe toate la sfarsitul subsecventei crescatoare
              int nr_act,val_act;
              s=s+s_rest;                  //suma totala
              nr_act=s/v[p];            //nr actiunilor cumparate
              s_rest=s-nr_act*v[p];  //determin restul din suma ramas dupa cumpararea actiunilor
              val_act=nr_act*v[i];   //determin valoarea actiunilor la sfarsitul subsecventei crescatoare adica dupa i-p zile
              s=val_act + s_rest;   //suma care o am la sfarsitul subsecventei crescatoare dupa vinderea actiunilor este val_act + restul ramas
              s_rest=0;               //restul l-am pus in suma mai inainte deci devine 0
          }
        i=i+1;                         //inaintez in vector
    }
    printf("%d\n", s-s_init);    //afisez profitul, adica suma modificata - suma initiala
    return 0;
}
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #4 : Februarie 21, 2012, 23:35:47 »

Trebuie sa declari val_act ca variabila long long pe linia 30 si sa afisezi rezultatul cu %lld.
Memorat
a_h1926
Echipa infoarena
Nu mai tace
*****

Karma: 317
Deconectat Deconectat

Mesaje: 385



Vezi Profilul
« Răspunde #5 : Februarie 22, 2012, 00:01:03 »

Va multumesc mult, asta era problema, a iesit de 100  Yahoo!
Memorat
flaviusc11
Strain
*

Karma: 1
Deconectat Deconectat

Mesaje: 26



Vezi Profilul
« Răspunde #6 : Februarie 22, 2012, 12:06:52 »

Multumesc foarte mult. Asta era problema. Nu am fost atent si am luat 0 puncte in loc de 100. Altadata voi fi mai atent.
Memorat
Tux2Nicolae
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #7 : Februarie 24, 2012, 23:38:37 »

EU CHEAR NU INTZELEG , imi pare ca ideia este corecta , cine ma poate ajuta va rog sami explicatzi ce nu e bine!

#include<stdio.h>
#define dim 100010
int n; long long s; int v[dim],c[dim];

Cod:
int main(){
    int i; long long max=0;
    freopen("bursa.in","r",stdin);
    freopen("bursa.out","w",stdout);
    scanf("%d %lld\n",&n,&s);
    for(i=1;i<=n;i++){ scanf("%d",&c[i]); v[i]=c[i]; }
    for(i=n;i>=1;i--){
        if (v[i]>=max) max=v[i];
        v[i]=max;
    }max=0;
    for(i=1;i<=n;i++){
        if(s/c[i]*v[i+1]-s+s%c[i]>max){
            max=s/c[i]*v[i+1]-s+s%c[i];
        }
    }
    printf("%lld\n",max);
}
« Ultima modificare: Februarie 24, 2012, 23:44:25 de către Telechi Nicolae » Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #8 : Februarie 25, 2012, 00:13:41 »

Poate ar fi mai util sa ne spui ideea ta. Oricum, vezi ca s-ar putea sa cumperi si sa vinzi de mai multe ori.
Memorat
horatiu13
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 3



Vezi Profilul
« Răspunde #9 : Februarie 07, 2014, 16:04:13 »

Imi poate spune cineva daca au ceva special fata de celelalte testele 2 si 10?
La toate testele imi da OK, doar la cele doua imi da INCORECT si nu imi dau seama unde am gresit.

Multumesc.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #10 : Februarie 07, 2014, 16:55:16 »

Citeste N+1 b-uri.
Memorat
vladm98
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 2



Vezi Profilul
« Răspunde #11 : Februarie 27, 2014, 19:07:43 »

Ce inseamna Killed by signal?
Memorat
Djok
Client obisnuit
**

Karma: 10
Deconectat Deconectat

Mesaje: 71



Vezi Profilul
« Răspunde #12 : Iulie 16, 2014, 11:57:38 »

http://www.infoarena.ro/documentatie/evaluator
Citește aici despre mesajele care le poate da evaluatorul
Memorat
Djok
Client obisnuit
**

Karma: 10
Deconectat Deconectat

Mesaje: 71



Vezi Profilul
« Răspunde #13 : Iulie 16, 2014, 12:16:21 »

Nu sunt sigur ce e greșit și ce e coret, însă rezolvând problema, am hotărât să citesc și soluțiile oficiale, unde era folosit maxim/minim local.
Eu am rezolvato doar cu condiția a[ i ] > a[ i-1 ] adică în ziua i-1 cumpăram acțiuni, și în ziua i le vindeam, astfel am obținut 100 de puncte, îmi poate cineva zice dacă o astfel de abordare este corectă? sau testele sunt slabe?
Memorat
RaduToporan
Strain


Karma: -3
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #14 : Martie 03, 2016, 12:53:01 »

Isi da cineva seama ce e gresit la:

#include <cstdio>

using namespace std;
int n,i,v[500005];
long long s,sinit,actiuni;

int main()
{
    freopen("bursa.in","r",stdin);
    freopen("bursa.out","w",stdout);
    scanf("%d%lld",&n,&s);
    for (i=1; i<=n; i++)
        scanf("%d",&v);
    sinit=s;
    v[0]=2000000000;
    v[n+1]=-2000000000;
    for (i=1; i<=n; i++)
        if (v[i-1]<v && v>v[i+1])
        {
            s=s+actiuni*v;
            actiuni=0;
        }
        else if (v[i-1]>v && v<v[i+1])
        {
            actiuni=actiuni+s/v;
            s=s%v;
        }
    printf("%lld\n",s-sinit);
    return 0;
}
Memorat
sichetpaul
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #15 : Mai 24, 2017, 18:23:50 »

Nu stiu de ce iau 0 puncte la pb. asta . I-am dat multe teste si cu toate merge. Va rog , daca se poate, sa ma ajutati.
Cod sursa:
#include <fstream>

using namespace std;
long long v[100002];
int main()
{ long long s,nr=0,n,i,Max=0;
    ifstream f("bursa.in");
    ofstream g("bursa.out");
    f>>n>>s;
    for (i=1;i<=n;++i) {
        f>>v;
        Max=max(Max,v);
    }
    v[0]=Max+1;
    for (i=1;i<=n;++i) {
        if (v>v[i-1] && v>v[i+1]) {
            s+=(v*nr);
            nr=0;
        }
       if (v<v[i+1] && v<v[i-1]) {
          nr=s/v;
          s-=(nr*v);
      }
    }
       g<<s<<'\n';
    return 0;
}
Memorat
sichetpaul
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #16 : Mai 24, 2017, 18:25:53 »

#include <fstream>

using namespace std;
long long v[100002];
int main()
{ long long s,nr=0,n,i,Max=0;
    ifstream f("bursa.in");
    ofstream g("bursa.out");
    f>>n>>s;
    for (i=1;i<=n;++i) {
        f>>v;
        Max=max(Max,v);
    }
    v[0]=Max+1;
    for (i=1;i<=n;++i) {
        if (v>v[i-1] && v>v[i+1]) {
            s+=(v*nr);
            nr=0;
        }
       if (v<v[i+1] && v<v[i-1]) {
          nr=s/v;
          s-=(nr*v);
      }
    }
       g<<s<<'\n';
    return 0;
}
Scuze.Am gresit putin la cod mai devreme
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines