Cod sursa(job #471003)

Utilizator darrenRares Buhai darren Data 16 iulie 2010 15:11:36
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>

using namespace std;

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


inline long long dub(long long a)
{
	return a * a;
}
inline long long power(int a, int b)
{
	if (b == 0) return 1;
	if (b == 1) return a;
	if (b % 2 == 0) return dub(power(a, b / 2));
	return a * dub(power(a, b / 2));
}

void Read();
void Solve();
void Write();

int n, c, a[33];
long long t, tot;
vector<pair<int, int> > v;
vector<pair<int, int> > sol;
int sols[33];

int main()
{
	Read();
	Solve();
	Write();
}

void Read()
{
	fin >> n >> c >> t;
	v.resize(n);
	for (int i = 0; i < n; ++i)
	{
		fin >> v[i].first >> v[i].second;
		a[v[i].first] = i;
	}
}

void Solve()
{
	sort(v.begin(), v.end(), greater<pair<int, int> >());
	for (vector<pair<int, int> >::iterator it = v.begin(); it != v.end(); ++it)
	{
		long long num = power(c, (*it).first);
		long long times = min(int(t / num), (*it).second);
		t -= times * num;
		sol.push_back(make_pair((*it).first, times));
		tot += times;
	}
	for (int i = 0; i < n; ++i)
		sols[a[sol[i].first]] = sol[i].second;
}

void Write()
{
	fout << tot << '\n';
	copy(sols, sols + n, ostream_iterator<int>(fout, " "));
}