Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 304 Sirag  (Citit de 1318 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« : Martie 28, 2009, 13:42:50 »

Aici puteti discuta despre problema Sirag.
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #1 : Februarie 12, 2010, 16:15:16 »

Ok, pai eu am rezolvat problema folosind heap-uri. Creez un max-heap si la fiecare pas extrag p maxime, scad minimul din toate si le reintroduc in heap. Iar numarul de siruri formate la fiecae pas p*min, apoi la final adun numaul de element ramase in heap. Problema este ca nu inteleg de ce pic pe al doilea test, daca puteti sa-mi spuneti unde gresesc ?
Cod:
#include <fstream>
#include <iterator>
#define Nmax 100001

/*
 *
 */
 using namespace std;
 int N;
 int H[Nmax], v[Nmax];
 void DownHeap( int k )
 {
     int son;
     while( true )
     {
         son=2*k;
         if( son > N )
            return;
         if( son < N && H[son] < H[son+1] )
            ++son;
         if( H[k] >= H[son] )
            return;
         swap( H[k], H[son] );
         k=son;
     }
 }
 void UpHeap( int k )
 {
     int key=H[k], f=k/2;
     while( k > 1 && key > H[f] )
     {
         swap( H[k], H[f] );
         k=f;
         f/=2;
     }
 }
int main( void )
{
    int k, i, j;
    ifstream in("sirag.in");
    in>>N>>k;
    copy( istream_iterator<int>( in ), istream_iterator<int>(), H+1 );
    for( i=N/2; i > 0; --i )
        DownHeap( i );
    for( j=0; N >= k; j+=k*v[k]  )
    {
        for( i=1; i <= k; ++i )
        {
            v[i]=H[1];
            H[1]=H[N];
            --N;
            DownHeap( 1 );
        }
        for( i=1; i < k; ++i )
        {
            v[i]-=v[k];
            if( v[i] > 0 )
            {
                H[++N]=v[i];
                UpHeap( N );
            }
        }
    }
    j+=N;
    ofstream out("sirag.out");
    out<<j<<'\n';
    return 0;
}
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #2 : Februarie 12, 2010, 17:12:05 »

Sursa ta pare buna, algoritmul in schimb este prost. Pentru exemplul:

Cod:
3 2
3
3
2

Raspunsul este 8, nu 7 cum iti da tie.
« Ultima modificare: Februarie 12, 2010, 20:47:26 de către Andrei Grigorean » Memorat

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

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #3 : Februarie 12, 2010, 18:28:04 »

algoritmul in schimb este prost. Pentru exemplul:
Multumesc pentru exemplu Smile. Chiar acuma am facut rost de descrierea solutie si am citit ca ei fac la fel ca mine sau n-am inteles eu bine ?
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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