Cod sursa(job #45163)

Utilizator TabaraTabara Mihai Tabara Data 1 aprilie 2007 09:34:30
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>

#define in "shop.in"
#define out "shop.out"
#define NMAX 31
#define INF (-1)*(1<<15)
#define minim( a, b ) ( (a) < (b) ? (a) : (b) )
int n, C;
long long suma;
long long L;
long long maxim;
long long a[NMAX];
int sol[NMAX], nr[NMAX], sel[NMAX];

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

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] );
    }
    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 Solve()
{
    int i;
    for ( i = 1; i <= n; ++i )
    {
        a[i] = putere( C, a[i] );
    }
    /*for ( i = 1; i <= n; ++i )
        fprintf( fout, "%d ", a[i] );*/
    long long LL = L;
    int count;
    int ok = 0;
    while ( LL )
    {
          maxim = INF;
          for ( i = 1; i <= n; ++i )
          {
              if ( !sel[i] && a[i] > maxim )
              {
                   ok = i, maxim = a[i];
              }
          }
          sel[ok] = 1;
          count = 0;
          count = minim( LL/a[ok], nr[ok] );
          sol[ok] = count;
          suma += sol[ok];
          LL -= a[ok] * count;
    }
    fprintf( fout, "%lld\n", suma );    
    for ( i = 1; i <= n; ++i )
        fprintf( fout, "%d ", sol[i] ); 
}