Cod sursa(job #742361)

Utilizator harababurelPuscas Sergiu harababurel Data 29 aprilie 2012 20:24:08
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;

ifstream f("shop.in");
ofstream g("shop.out");

long long ridica_la_putere(int a, int b) {
	int i;
	long long rez=1;
	for(i=1; i<=b; i++) rez*=a;
	return rez;
}
int cmp( pair < pair <int, int >, int > x, pair < pair <int, int>, int> y) {
	return (x.first.first<=y.first.first);	
}
long long min(long long a, long long b) {
	if(a<b) return a;
	return b;
}

int main() {
	long long n, l, c, i, j, valoare, cantitate, folosite=0, putere, fol[35], cat;
	
	vector < pair < pair < int, int >, int > > v;
	//am un vector de forma:
	//v.first.first   - exponentul
	//v.first.second  - cantitatea
	//v.second		  - indicele monedei in sirul initial (inainte de sortare
	
	f>>n>>c>>l;
	for(i=1; i<=n; i++) {
		fol[i]=0;
		f>>valoare>>cantitate;
		v.push_back(make_pair( make_pair(valoare,cantitate), i));
	}
	
	sort(v.begin(), v.end(), cmp); //sortez crescator dupa valoare
	
	i=n;
	while(l>0) {
		i--;
		putere = ridica_la_putere(c, v[i].first.first);
		
		cat = min(v[i].first.second, l/putere);
		
		//aici presupun ca folosesc toata cantitatea de monede (de un anumit tip)
		//daca suma L ramasa ii mai mica decat toata cantitatea de monede
		//atunci folosesc numai cate trebuie
		//echivalent cu cat = min(v[i].first.second, l/putere);
		
		l-= putere*cat;
		folosite+=cat;
		fol[v[i].second]+=cat;	//v[i].second ii indicele dinaintea sortarii, ca sa nu mai sortez o data in fctie de indice
	}
	
	
	g<<folosite<<"\n";
	for(i=1; i<=n; i++) {
		g<<fol[i]<<" ";
	}
	g<<"\n";
		

	f.close();
	g.close();
	return 0;
}