Cod sursa(job #248149)

Utilizator alexeiIacob Radu alexei Data 24 ianuarie 2009 23:18:08
Problema Shop Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<cstdio>
#include<algorithm>
using namespace std;

#define NMAX 32

pair< long long, int > A[NMAX];

long long SOL[NMAX];
int I[NMAX];

inline bool cmp(const int a,const int b)
{
	return A[a].first > A[b].first;
}

int main()
{
	freopen("shop.in","r",stdin);
	freopen("shop.out","w",stdout);
	
	long long N,C,ANS=0;
	long long L;
	scanf("%lld%lld%lld\n",&N,&C,&L);
	
	long long i,a1,a2;
	for(i=1; i<=N; ++i)
	{
		scanf("%lld%lld\n",&a1,&a2);
		if( a1<=30 )
			A[i].first=1<<a1;
		else
			if( a1==31 )
				A[i].first=2147483648;
			//else
				//if( a1==32 )
				//A[i].first=4294967296;
		
		A[i].second=a2;
		I[i]=i;
		//printf("%lld\n",A[i].first);
	}
	
	sort( I+1, I+1+N, cmp );
	
	i=1;
	long long MIN;
	while( L && i<=N )
	{
		a1=I[i];

		if( A[a1].first > L )
		{ ++i; continue;}
		
		a2=(L/A[a1].first);
		MIN=a2<A[a1].second?a2:A[a1].second;
		L-=MIN*A[a1].first;ANS+=MIN; SOL[ a1 ]+=MIN;
		++i;
	}

	printf("%lld\n",ANS);

	for(i=1; i<=N; ++i)
		printf("%lld ",SOL[i]);
	printf("\n");
	return 0;
}