Cod sursa(job #43704)

Utilizator SpiriSpiridon Alexandru Spiri Data 30 martie 2007 13:57:06
Problema Shop Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
using namespace std;
#define MAX 35
#define INF 1000000

struct ban {
    int a;
    int c;
} b[MAX], aux;

long long int n, l, C;
long long int nr[MAX];
int s2[MAX];
int s[MAX];
long long int rez[MAX];
int poz[MAX];
long long int sum = 0;
long long int nrmin = INF;
int nrm = 0;
int pre = 0;

ifstream fin ("shop.in");
ofstream fout ("shop.out");

void QuickS(int st, int dr);
void Rec();

int main()
{
    fin >> n >> C >> l;
    long long int ama = 0;
    for ( int i = 1; i <= n; i++ )
    {
        fin >> b[i].a >> b[i].c;
        s2[b[i].a] = 1;
        poz[b[i].a] = i;
        if ( b[i].a > ama ) ama = b[i].a;
    }    
    QuickS(1,n);

    fin.close();
    
    pre = n;
    Rec();
    
    fout << nrmin << "\n";
    for ( int i = 1; i <= n; i++ )
    {
        fout << rez[i] << " ";
    }    
    
    fout.close();
    return 0;
}   

void Rec()
{
    for ( int i = pre; i >= 1; i-- )
    {
        if ( s[i] + 1 <= b[i].c )
        {
            long long int po = 1;
            for ( int j = 1; j <= b[i].a; j++ )
            {
                po*=C;
            }     
            sum+=po;
            nrm++;
            nr[poz[b[i].a]]++;
            s[i]++;
            if ( sum == l )
            {
                if ( nrm <= nrmin )
                {
                    nrmin = nrm;
                    for ( int j = 1; j <= n; j++ )
                    {
                        rez[j] = nr[j];
                    }    
                }    
            }    
            else 
            {
                pre = i;
                Rec();
            }
            nrm--;
            sum-=po;
            nr[poz[b[i].a]]--;  
            s[i]--;  
        }    
    }    
}       

void QuickS(int st, int dr)
{
    int pivot = (st+dr)>>1;
    int i = st-1;
    int j = dr+1;
    do 
    {
        do { i++; } while ( b[i].a < b[pivot].a );
        do { j--; } while ( b[j].a > b[pivot].a );
        if ( i <= j )
        {
            aux = b[i];
            b[i] = b[j];
            b[j] = aux;
            int au = nr[b[i].a];
            nr[b[i].a] = nr[b[j].a];
            nr[b[j].a] = au;
        }    
    } while ( i <= j );
    if ( j >= st ) QuickS(st,j);
    if ( i <= dr ) QuickS(i,dr);
}