Pagini recente » Cod sursa (job #1261148) | Cod sursa (job #1163723) | Cod sursa (job #427292) | Cod sursa (job #1186530) | Cod sursa (job #742359)
Cod sursa(job #742359)
#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);
}
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++) {
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 = v[i].first.second; //toata cantitatea
if( l/putere < cat) cat = l/putere; //in caz ca nu pot folosi toata cantitatea
//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;
}