Pagini recente » Cod sursa (job #2183862) | Cod sursa (job #1989733) | Cod sursa (job #1261983) | Cod sursa (job #808165) | Cod sursa (job #742361)
Cod sursa(job #742361)
#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;
}