Cod sursa(job #741392)

Utilizator vendettaSalajan Razvan vendetta Data 25 aprilie 2012 22:08:26
Problema Shop Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <iostream>
#include <algorithm>

#define ll long long
#define nmax 35
#define val first
#define ap second
using namespace std;

ll n, c, l, frec[nmax], Min;

pair<ll, pair<ll, ll> > v[nmax];

ifstream f("shop.in");
ofstream g("shop.out");

ll putere(ll a, ll b){

    ll rez = 1;
    while(b){
        if( b % 2 == 1) rez = rez * a;
        a = a * a;
        b = b / 2;
    }

    return rez;

}

void citeste(){

    f >> n >> c >> l;
    for(int i=1; i<=n; i++){
        int a,b;
        f >> a >> b;
        v[i].val = putere(c,a);
        v[i].ap.val = b;
        v[i].ap.ap = i;
    }

    sort(v+1, v+n+1);

}

void rezolva(){

    for(int i=n; i; i--){
        if (v[i].val > l) continue;
        frec[i] = 1;
        for(; l && frec[i]<=v[i].ap.val && v[i].val<=l; l-=v[i].val,++frec[i]);
        //while (frec[i] <= v[i].val && l && v[i].val<=l){

        //if (l<0) l += v[i].val, --frec[i];
        if (frec[i] > v[i].ap.val||v[i].val> l){
            --frec[i];
        }
        cout << frec[i] << "\n";
        Min += frec[i];
    }

}

void scrie(){

    g << Min << "\n";

    for(int i=1; i<=n; i++) g << frec[v[i].ap.ap] << " ";

}

int main(){

    citeste();
    rezolva();
    scrie();

    f.close();
    g.close();

    return 0;

}