Cod sursa(job #55250)

Utilizator anoukAnca Dumitrache anouk Data 26 aprilie 2007 20:57:16
Problema Shop Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define DIM 31
using namespace std;

long long int L, N, C;
struct Moneda {
       int a, poz;
       long long b;
};
vector <Moneda> A;
long long nrm[DIM];
long long sol;

bool cmp(Moneda X, Moneda Y)
{
     return X.a > Y.a;
}

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;
}

int main()
{
    FILE *fin = fopen("shop.in", "r");
    FILE *fout = fopen("shop.out", "w");
    
    fscanf(fin, "%lld%lld%lld", &N, &C, &L);
    A.resize(N+1);
    int i, x, y;
    for (i = 0; i < N; i++)
    {
        fscanf(fin, "%d%d", &x, &y);
        A[i].a = x;
        A[i].b = y;
        A[i].poz = i;
    }
    
    sort(A.begin(), A.end(), cmp);
    i = 0;
    long long u, v;
    while (L && i < N)
    {
          u = Putere(C,  A[i].a);
          v = L / u;
          if (v > A[i].b)
          {
             nrm[A[i].poz] = A[i].b;
             sol += A[i].b;
             L -= A[i].b * u;
          }
          else if (v)
          {
             nrm[A[i].poz] = v;
             L -= nrm[A[i].poz] * u;
             sol += nrm[A[i].poz];
          }
          i++;
    }
    
    fprintf(fout, "%lld\n", sol);
    for (int i = 0; i < N; i++)
        fprintf(fout, "%lld ", nrm[i]);
    
    fclose(fin);
    fclose(fout);
    return 0;
}