Cod sursa(job #1167918)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 6 aprilie 2014 11:47:28
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<fstream>
using namespace std;
long long n,c,l;
struct monezi{
    int poz;
    int a;
    long long cant;
};

struct monezi b[40];

long long m[40];
ifstream in("shop.in");
ofstream out("shop.out");

void citire()
{

    in>>n>>c>>l;
    for(int i = 1 ; i <= n ; i++)
    {
        in>>b[i].a>>b[i].cant;
        b[i].poz = i;
    }
    in.close();
}

void quicksort(int left , int right)
{

    int i = left,j = right;
    int pivot = b[(i+j)/2].a;
    struct monezi aux;
    while(i<=j)
    {

        while(b[i].a<pivot) i++;
        while(b[j].a>pivot) j--;
        if(i<=j)
        {

            aux = b[i];
            b[i] = b[j];
            b[j] = aux;
            i++;
            j--;
        }
    }
    if(left < j) quicksort(left,j);
    if(i < right) quicksort(i,right);
}

long long power(long long b,int e)
{
    long long sol = 1;
    if(e == 0) return 1;
    while(e)
    {
        if(e%2){
            sol*=b;
            e--;
        }
        b=b*b;
        if(e) e/=2;
    }
    return sol;
}

void solve()
{
    quicksort(1,n);
    long long sum = 0,i=n,s = l,a,sol=0;
    while(sum < l){
        a = power(c,b[i].a);
        if(a == 0) a = 1;
        if(s/a>b[i].cant){
            m[b[i].poz] = b[i].cant;
            sum+=a*b[i].cant;
            s-=a*b[i].cant;
            sol+=b[i].cant;
        }
        else {
            m[b[i].poz] = s/a;
            sum+=a*(s/a);
            sol+=s/a;
            s-=a*(s/a);
        }
        i--;
        }
    out<<sol<<"\n";
    for(i = 1 ; i <=n ; i++)
        out<<m[i]<<" ";
    out.close();
}

int main()
{

    citire();
    solve();
    return 0;
}