Cod sursa(job #199981)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 21 iulie 2008 15:25:13
Problema Shop Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#define task "shop"
#define score 100
#include <stdio.h>
#include <stdlib.h>
#define fin "shop.in"
#define fout "shop.out"
#define ferr "shop.err"
#define N 32
long long a[N];
int b[N];
int n,c,l;
int cate[N];
int poz[N];
void scan(void){
	int i,x,aux,j;
	long long aux1;
	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);
	//freopen(ferr,"w",stderr);
	scanf("%d%d%d",&n,&c,&l);
	for (i=1;i<=n;++i){
		a[i]=1;poz[i]=i;
		scanf("%d%d",&x,&b[i]);
		for (j=1;j<=x;++j)
			a[i]*=c;
	}
	for (i=1;i<n;++i)
		for (j=i+1;j<=n;++j){
			if (a[i]>a[j]){
				aux1=a[i];
				a[i]=a[j];
				a[j]=aux1;
				aux=b[i];
				b[i]=b[j];
				b[j]=aux;
				aux=poz[i];
				poz[i]=poz[j];
				poz[j]=aux;
			}
		}
}
int min(int a,int b){
    if (a>b)
       return b;
    return a;
}
void solve(void){
	int i,poz=n;
	while (l){
		while (a[poz]>(long long )l && poz>=1)
			--poz;
		//if (poz<1)
			//return;
		cate[poz]=min(l/a[poz],b[poz]);
		b[poz]-=cate[poz];
		--poz;
        l-=cate[poz+1]*a[poz+1];
		//fprintf(stderr,"%d %d\n",l,a[poz]);
	}
}
int sol[N];
void print(void){
    int i,s=0;
    for (i=1;i<=n;++i){
        s+=cate[i];
        sol[poz[i]]=cate[i];
    }
    printf("%d\n",s);
	for (i=1;i<=n;++i)
		printf("%d ",sol[i]);
	printf("\n");
    /*for (i=1;i<=n;++i)
		printf("%lld ",a[i]);
	printf("\n");
    for (i=1;i<=n;++i)
		printf("%d ",b[i]);*/
	exit(0);
}
int main(void){
	scan();
	solve();
	print();
}