Cod sursa(job #55244)

Utilizator anoukAnca Dumitrache anouk Data 26 aprilie 2007 20:47:38
Problema Shop Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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 b, int e)
{
    long long sol = 1;
    for (int i = 1; i <= e; i++)
        sol *= b;
    return sol;
}

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;
    while (L && i < N)
    {
          x = Putere(C,  A[i].a);
          if (L / x > A[i].b)
          {
             nrm[A[i].poz] = A[i].b;
             sol += A[i].b;
             L -= A[i].b * x;
          }
          else if (x)
          {
             nrm[A[i].poz] = L / x;
             L -= nrm[A[i].poz] * x;
             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;
}