Cod sursa(job #45160)

Utilizator TabaraTabara Mihai Tabara Data 1 aprilie 2007 09:04:15
Problema Shop Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <stdio.h>

#define in "shop.in"
#define out "shop.out"
#define NMAX 31

#define minim( a, b ) ( (a) < (b) ? (a) : (b) )
int n, C;
long long suma;
long long L;
long long a[NMAX];
int sol[NMAX], nr[NMAX];

long long putere( int a, long long b );
void Read();
void Solve();
void QSort( int, int);

FILE *fout = fopen ( out, "w" );

int main()
{
    Read();
    Solve();

    fclose ( fout );
    return 0;
}

void Read()
{
    FILE *fin = fopen ( in, "r" );
    fscanf( fin, "%d%d%lld", &n, &C, &L );   
    int i;
    for ( i = 1; i <= n; ++i )
    {
        fscanf( fin, "%lld%d", &a[i], &nr[i] );
    }
    /*for ( i = 1; i <= n; ++i )
        fprintf( fout, "%d ", a[i] );
    fprintf( fout, "\n" );*/
    fclose( fin );
}

long long putere( int a, long long b )
{
    if ( b == 0 ) return 1;   
    if ( b == 1 ) return a;
    
    if ( (b&1) == 0 ) return putere( a, (b>>1) ) * putere ( a, (b>>1) );
    if ( (b&1) == 1 ) return putere ( a, (b>>1) ) * putere ( a, (b>>1) ) * a;
}
        
void QSort( int st, int dr )
{
    long long pivot = a[st];
    int i = st - 1, j = dr + 1;
    do
    {
        do { i++; } while ( a[i] < pivot );
        do { j--; } while ( a[j] > pivot );
        if ( i <= j )
        {
            long long aux = a[i];
            a[i] = a[j];
            a[j] = aux;
            
            aux = nr[i];
            nr[i] = nr[j];
            nr[j] = aux;
        }
    } while ( i <= j );
   
    if ( i < dr ) QSort( i, dr );
    if ( st < j ) QSort( st, j );
}
       
void Solve()
{
    int i, j;
    for ( i = 1; i <= n; ++i )
    {
        a[i] = putere( C, a[i] );
    }
    QSort( 1, n );
   
    /*for ( i = 1; i <= n; ++i )
        fprintf( fout, "%d ", a[i] );
    fprintf( fout, "\n" );
    
    for ( i = n; i >=1; --i )
        fprintf( fout, "%d ", nr[i] );
    fprintf( fout, "\n\n" );
    */
    long long LL = L;
    int count;
    for ( i = n; i >= 1; --i )
    {
        count = 0;
        //fprintf( fout, "%lld  ", L );
        //count = minim( L/a[i], nr[i] );
        /*if ( L/a[i] < nr[i] ) count = L/a[i];
        else count = nr[i];*/
        count = minim( L/a[i], nr[i] );
        
        //fprintf( fout, "rap:%lld numar:%d\n", nr[i], L/a[i] );
        sol[i] = count;
        suma += sol[i];
        L -= a[i] * count;
    }
    fprintf( fout, "%lld\n", suma );    
    for ( i = 1; i <= n; ++i )
        fprintf( fout, "%d ", sol[i] ); 
}