Pagini recente » Cod sursa (job #2067907) | Cod sursa (job #2926352) | Cod sursa (job #1319549) | Cod sursa (job #45097) | Cod sursa (job #3261539)
#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(2, vector<int> (LMAX, -1));
dp[0][0] = 0;
int x, y, line, i, la;
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 <= 100; la++) {
if (dp[1 - line][la - x] != -1 && dp[1 - line][la - x] + y > dp[line][la]) {
// fout<<dp[1 - line][la - x]<<" ";
dp[line][la] = dp[1 - line][la - x] + y;
// fout<<i<<" "<<la<<" "<<x<<endl;
reconst[i][la] = la - x;
}
}
}
}
for (la = l; la <= 100; la++) {
if (dp[line][la] >= l) return 1;
}
return 0;
}
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;
while (j <= 100 && dp[(n&1)][j] < l) {
j++;
}
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;
}