Pagini recente » Cod sursa (job #1170868) | Cod sursa (job #2274857) | Cod sursa (job #2114964) | Cod sursa (job #2968020) | Cod sursa (job #3281264)
//https://infoarena.ro/problema/lapte
//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES
#include <iostream>
#include <fstream>
//#include <cmath>
//#include <bitset>
#include <vector>
#include <cstring>
//#include <queue>
//#include <utility>
//#include <algorithm>
//#include <string>
//#include <map>
//#include <climits>
//#include <iomanip>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
vector <pair<int, int>> v;
int d[105][105], rezm[105][105], rezv[105];
int n, l;
bool verif(int mij)
{
int i, j, k;
memset(d, -1, sizeof(d));
d[0][0] = 0;
for (i = 1; i <= n; ++i)
{
for (j = 0; j <= l; ++j)
{
for (k = 0; k <= j&& k * v[i].first <= mij; ++k)
{
if (d[i - 1][j - k] >= 0)
{
int x = d[i - 1][j - k] + (mij - k * v[i].first) / v[i].second;
if (x > d[i][j])
{
d[i][j] = x;
rezm[i][j] = k;
}
}
}
}
}
return (d[n][l] >= l);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int i, x, y, rez, sum;
v.emplace_back(0, 0);
fin >> n >> l;
for (i = 1; i <= n; ++i)
{
fin >> x >> y;
v.emplace_back(x, y);
}
int st, dr, mij;
st = 1;
dr = 105;
while (st <= dr)
{
mij = (st + dr) / 2;
if (verif(mij))
{
dr = mij - 1;
}
else
{
st = mij + 1;
}
}
rez = dr + 1;
verif(rez);
for (i = n, sum = l; i > 0; --i)
{
rezv[i] = rezm[i][sum];
sum -= rezv[i];
}
fout << rez << "\n";
for (i = 1; i <= n; ++i)
{
fout << rezv[i] << " " << (rez - rezv[i] * v[i].first) / v[i].second << "\n";
}
return 0;
}