Cod sursa(job #903547)

Utilizator sebii_cSebastian Claici sebii_c Data 1 martie 2013 22:08:58
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>

#include <algorithm>
#include <vector>

using namespace std;

const int MAXN = 33;

int N, C;
int num[MAXN];
int sol[MAXN];
bool seen[MAXN];

long long L;
long long ppow[MAXN];

void precalc()
{
    ppow[0] = 1;
    for (int i = 1; i < MAXN; ++i)
        ppow[i] = C * ppow[i - 1];
}

int doit()
{
    int min_num = 0;
    for (int i = MAXN - 1; i >= 0; --i) {
        while (num[i] > 0 && L >= ppow[i]) {
            int k = min((long long) num[i], L / ppow[i]);
            L -= k * ppow[i];
            num[i] -= k;
            sol[i] += k;
            min_num += k;
        }
    }

    return min_num;
}

int main()
{
    freopen("shop.in", "r", stdin);
    freopen("shop.out", "w", stdout);

    scanf("%d %d %lld", &N, &C, &L);

    vector<int> coins;
    for (int i = 0; i < N; ++i) {
        int a, b;
        scanf("%d %d", &a, &b);
        num[a] += b;
        coins.push_back(a);
    }

    precalc();
    printf("%d\n", doit());

    vector<int>::iterator it;
    for (it = coins.begin(); it != coins.end(); ++it)
        printf("%d ", sol[*it]);
    printf("\n");

    return 0;
}