Cod sursa(job #46635)

Utilizator megabyteBarsan Paul megabyte Data 2 aprilie 2007 20:02:03
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#define INF "shop.in"
#define OUF "shop.out"
#define NMAX 32
#define ULL unsigned long long
#define MIN(a,b) ((a<b)?(a):(b))

struct moneda
{
	int pt,ct,id;
	ULL val;
}ban[NMAX];

ULL lpow(ULL base,ULL pw)
{
	ULL rez=1,nr,aux,p;
	nr=pw;p=base;
	while(nr)
	{
		if(nr%2) rez*=p;
                p*=p;nr/=2;
	}
	return rez;
}

int main()
{
	FILE *in,*out;
	int n,i,j;
	ULL sol[NMAX]={0},sum=0;
	ULL c,l;
	moneda aux;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
        fscanf(in,"%d %lld %lld",&n,&c,&l);
	for(i=1;i<=n;i++)
	{
		fscanf(in,"%d %d",&ban[i].pt,&ban[i].ct);
		ban[i].id=i;
		ban[i].val=lpow(c,(ULL)ban[i].pt);
	}

	for(i=1;i<n;i++)
		for(j=i+1;j<=n;j++)
		if(ban[i].pt<ban[j].pt)
		{
			aux=ban[i];
			ban[i]=ban[j];
			ban[j]=aux;
		}
        
	for(i=1;i<=n&&l;i++) 
	{ 

		sum+=sol[ban[i].id]=MIN((l/ban[i].val),ban[i].ct);
		l-=sol[ban[i].id]*ban[i].val;
	}

	fprintf(out,"%lld\n",sum);
	for(i=1;i<=n;i++) fprintf(out,"%lld ",sol[i]);

	fclose(in);fclose(out);
	return 0;
}