Cod sursa(job #43521)

Utilizator cos_minBondane Cosmin cos_min Data 30 martie 2007 11:23:24
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <stdio.h>

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

int A[dim], Nr[dim], sol[dim]; // C^A[i] 
int N, C, q=0;
long long L, Val[dim];
bool sel[dim];

long long Putere(int,int);
void Qsort(int,int);
long long Minim( long long a, long long b)
{
    if ( a < b ) return a;
    return b;
}
    

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d%lld", &N, &C, &L);
    for ( int i = 1; i <= N; i++ )
    {
        scanf("%d%d", &A[i], &Nr[i]);
        Val[i] = Putere(C,A[i]);
    }   
    
    int ok = 0;
    int maxim = 0, poz;
    long long total=0;
    
    while ( ok == 0 )
    { 
        maxim = -1;
        for ( int i = 1; i <= N; i++ )
        {
             if ( maxim < A[i] && !sel[i] ) maxim = A[i], poz = i;
        }
        
        sel[poz] = 1; 
        
        long long t = L/Val[poz];
        
        sol[poz] = Minim( t, Nr[poz] );
        total += sol[poz];
         
        L -= Val[poz]*sol[poz];
        
        if ( L <= 0 ) ok = 1;
    }    
    
    printf("%lld\n", total);
    for ( int i = 1; i <= N; i++ )
        printf("%d ", sol[i] ); 
} 

void Qsort(int st, int dr)
{
    int i = st-1;
    int j = dr+1;
    int pivot = A[st];
    
    while ( i <= j )
    {
        do { i++; } while ( A[i] < pivot );
        do { j--; } while ( A[j] > pivot );
        
        if ( i <= j )
        {
            int aux = A[i];
            A[i] = A[j];
            A[j] = aux;
            aux = Nr[i];
            Nr[i] = aux;
            Nr[j] = aux;
        }    
    } 
    
    if ( st < j ) Qsort(st,j);
    if ( i < dr ) Qsort(i,dr);    
}    

long long Putere(int p, int n)
{
    q++;
    if ( n == 1 ) return p;
    else if ( n == 0 ) return 1;
    else          
    {
        if ( n % 2 == 0 ) 
        {
            long long t = Putere(p,n/2);
            return t*t;
        }    
        else        
        {
            long long t = Putere(p,n/2);
            return t*t*p;
        }   
    }    
}