Cod sursa(job #1637066)

Utilizator PraetorGrigorosoaia Florin Praetor Data 7 martie 2016 14:42:14
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<fstream>
#include<algorithm>
#define MNOT 32 // maximum number of types(of coins)

using namespace std;

FILE*in;
ofstream out("shop.out");

int nr_of_types;
int base;
long long total_sum;
long long nr_of_coins_used[MNOT+2];
long long coins_sum;

struct coin
{
    int A; // exponent
    long long B; // number of coins
}COIN[MNOT], mirror_COIN[MNOT];

long long POWER(int BASE, int EXPO)
{
    if (!EXPO)
        return 1;
    return BASE*POWER(BASE, EXPO-1);
}

long long condition(coin I, coin J)
{
    return I.A>J.A;
}

void read()
{
    in=fopen("shop.in", "r");

    fscanf(in, "%d%d%lld", &nr_of_types, &base, &total_sum);
    for (int i=1; i<=nr_of_types; i++)
    {
        fscanf(in, "%d%lld", &COIN[i].A, &COIN[i].B);

        mirror_COIN[i].A=COIN[i].A;
        mirror_COIN[i].B=COIN[i].B;
    }
}

void build_nr_of_coins_used()
{
    for (int i=1; i<=nr_of_types, total_sum; i++)
    {
        long long power=POWER(base, COIN[i].A);
        long long D=total_sum/power;

        nr_of_coins_used[COIN[i].A]=min(COIN[i].B, D);

        coins_sum+=nr_of_coins_used[COIN[i].A];

        total_sum-=(nr_of_coins_used[COIN[i].A]*power);
    }
}

void solve()
{
    sort(COIN+1, COIN+nr_of_types+1, condition);
    build_nr_of_coins_used();
}

void show()
{
    out<<coins_sum<<'\n';

    for (int i=1; i<=nr_of_types; i++)
        out<<nr_of_coins_used[mirror_COIN[i].A]<<" ";
}

int main()
{
    read();
    solve();
    show();

    return 0;
}