Cod sursa(job #2035052)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 8 octombrie 2017 21:27:13
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

struct elem{
    long long first, second;
    long long pos;
    bool operator <(const elem &aux) const{
        return first < aux.first;
    }
};

std::priority_queue <elem> pq;
long long pw[40];
long long f[40];

inline long long minim(long long a, long long b){
    return a < b ? a : b;
}

int main(){
    FILE*fi,*fo;
    fi = fopen("shop.in","r");
    fo = fopen("shop.out","w");

    long long n;
    long long c, l;
    fscanf(fi,"%lld%lld%lld", &n, &c, &l);
    for(int i = 1; i <= n; i++){
        long long a, b;
        fscanf(fi,"%lld%lld", &a, &b);
        pq.push({a, b, i});
    }
    pw[0] = 1;
    int ind = 1;
    while(pw[ind - 1] * c <= l){
        pw[ind] = pw[ind - 1] * c;
        ind++;
    }
    long long cnt = 0;
    while(l > 0){
        while(pw[pq.top().first] > l) pq.pop();
        long long nr = l / pw[pq.top().first];
        l = l - minim(nr, pq.top().second) * pw[pq.top().first];
        f[pq.top().pos] += minim(nr, pq.top().second);
        cnt += minim(nr, pq.top().second);
        pq.pop();
    }
    fprintf(fo,"%lld\n", cnt);
    for(int i = 1; i <= n; i++)
        fprintf(fo,"%lld ", f[i]);
    fclose(fi);
    fclose(fo);
    return 0;
}