Pagini recente » Cod sursa (job #112982) | Cod sursa (job #1308594) | Cod sursa (job #1227805) | Cod sursa (job #527899) | Cod sursa (job #3261548)
#include <vector>
#include <queue>
#include <fstream>
#include <iostream>
#include <climits>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int LMAX = 105;
//const int MOD = 1000000007;
//caut binar timpul minim pentru a bea cantitatea de lapte
//dp[i][la] -> cantitatea maxim de lapte b daca se beau la litrii de lapte
//va[i] -> timpul in care se bea un litru
//x se va duce pana la t/va[i] si y va fi t - va[i]*x/vb[i]
int va[LMAX], vb[LMAX], n, l, reconst[LMAX][LMAX];
vector<vector<int>> dp;
bool check(int t) { //timpul minim
dp.assign(LMAX, vector<int> (LMAX, -1));
dp[0][0] = 0;
int x, y, i, la, line;
for (i = 1; i <= n; i++) {
// line = (i&1);
for (x = 0; x <= t/va[i]; x++) {
y = (t - va[i]*x)/vb[i];
for (la = x; la <= l; la++) {
if (dp[i - 1][la - x] != -1 && dp[i - 1][la - x] + y > dp[i][la]) {
dp[i][la] = dp[i - 1][la - x] + y;
reconst[i][la] = la - x;
}
}
}
}
return dp[n][l] >= l;
}
int main() {
int i, j;
fin>>n>>l;
for (i = 1; i <= n; i++) {
fin>>va[i]>>vb[i];
}
int s, d, mij;
s = -1;
d = 100;
while (s + 1 != d) {
mij = ((s + d)>>1);
if (check(mij)) d = mij;
else s = mij;
}
fout<<d<<"\n";
check(d);
vector<int> sol;
j = l;
i = n;
while (i > 0) {
sol.push_back(j);
j = reconst[i][j];
i--;
}
sol.push_back(0);
for (i = n - 1; i >= 0; i--) {
int cant = sol[i] - sol[i + 1]; //cantitatea de a bauta
fout<<cant<<" "<<(d - va[n - i]*cant)/vb[n - i]<<"\n";
}
fin.close();
fout.close();
return 0;
}