Cod sursa(job #1002765)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 28 septembrie 2013 19:31:52
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define lim 1000000
#define Next ++pos == lim?(f.read(buffer, lim), pos = 0):0

using namespace std;

int n, C;
int pos;
char buffer[lim];
long long sum_answer, L;
ifstream f ("shop.in");

inline void Read(int &x)
{
    for (;buffer[pos] < '0' || buffer[pos] > '9'; Next);
    for (x = 0; '0' <= buffer[pos] && buffer[pos] <= '9'; x = x*10 + buffer[pos] - '0', Next);
}

inline void Read(long long &x)
{
    for (;buffer[pos] < '0' || buffer[pos] > '9'; Next);
    for (x = 0; '0' <= buffer[pos] && buffer[pos] <= '9'; x = x*10 + buffer[pos] - '0', Next);
}

inline long long Pow(const int base, const int exp)
{
    long long ret = 1LL;
    int i;
    for (i=1; i<=exp; ++i)
        ret *= base;
    return ret;
}

struct money
{
    int amount, position;
    long long value, answer;
};
money a[32];

inline void Read()
{
    Read(n), Read(C), Read(L);
    int i, x, y;
    for (i=1; i<=n; ++i)
    {
        Read(x), Read(y);
        a[i].value = Pow(C, x);
        a[i].amount = y;
        a[i].position = i;
    }
    f.close();
}

inline bool cmp_value (const money A, const money B)
{
    return A.value > B.value;
}

inline bool cmp_position (const money A, const money B)
{
    return A.position < B.position;
}

inline long long min(const int x, const long long y)
{
    return x<y?x:y;
}

inline void Solve()
{
    sort(a+1, a+n+1, cmp_value);
    int i;
    for (i=1; i<=n; ++i)
    {
        a[i].answer = min(a[i].amount, 1LL*L/a[i].value);
        sum_answer += a[i].answer;
        L -= 1LL*a[i].answer*a[i].value;
    }
    sort (a+1, a+n+1, cmp_position);
}

inline void Write()
{
    ofstream g("shop.out");
    g<<sum_answer<<"\n";
    int i;
    for (i=1; i<=n; ++i)
        g<<a[i].answer<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}