Cod sursa(job #38499)

Utilizator astronomyAirinei Adrian astronomy Data 25 martie 2007 20:42:46
Problema Shop Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>

#define MAXN 63
#define INF (1e18+2)
#define swap(a,b) (a^=b, b^=a, a^=b)

typedef long long llong;
typedef long double real;

int N, C, B[MAXN], ind[MAXN], cnt[MAXN];
llong L, val[MAXN];

void solve(void)
{
    int i, j, t, st, dr, m, r;
    real p;
    
    for(i = 1; i <= N; i++)
     for(j = i+1; j <= N; j++)
      if(val[i] < val[j])
        swap(val[i], val[j]), swap(ind[i], ind[j]), swap(B[i], B[j]);


    for(i = 1; i <= N; i++)
    {
        st = r = 0, dr = B[i];
        while(st <= dr)
        {
            m = (st+dr) >> 1;
            p = (real)m*val[i];

            if(p > INF)
                dr = m-1;
            else
            {
                if( val[i]*m <= L )
                    r = m, st = m+1;
                else
                    dr = m-1;
            }
        }
        cnt[ind[i]] = r, L = L-val[i]*r;
    }
}

void read_data(void)
{
    int i, j, k;
    llong t;
    
    scanf("%d %d %lld\n", &N, &C, &L);

    for(i = 1; i <= N; i++)
    {
        scanf("%d %d\n", &j, &B[i]), ind[i] = i;
        for(t = 1, k = 1; k <= j; k++)
            t = t*C;
        val[i] = t;
    }
}

void write_data(void)
{
    int i, res = 0;

    for(i = 1; i <= N; i++)
        res += cnt[i];

    printf("%d\n", res);
    for(i = 1; i < N; i++)
        printf("%d ", cnt[i]);
    printf("%d\n", cnt[N]);
}

int main(void)
{
    freopen("shop.in", "rt", stdin);
    freopen("shop.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}