Pagini recente » Cod sursa (job #18025) | Cod sursa (job #1501734) | Cod sursa (job #1308375) | Cod sursa (job #2857337) | Cod sursa (job #1599318)
#include<fstream>
#include<vector>
#include<iostream>
#include<stack>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, l, t, start;
stack <pair<int, int> > S;
int LBS[105][105], LB[105][105], V[3][105], A[105][105], AS[105][105];
void citire()
{
f>>n>>l;
for(int i=1; i<=n; i++)
f>>V[1][i]>>V[2][i];
}
bool dinam(int timp)
{
int i, j, k, s = (timp/V[1][1]), l2, v1, v2;
for(i=0; i<=n; i++)
for(j=0; j<=100; j++){
LB[i][j] = -1;
A[i][j] = -1;
}
for(i=0; i <= (timp/v1); i++){
LB[1][i] = (timp - i*V[1][1])/V[2][1];
A[1][i] = i;
}
for(i=2; i<=n; i++){
v1 = V[1][i];
v2 = V[2][i];
s += (timp/v1);
for(j = 0; j <= 100 && j <= s; j++){
for(k = 0; k <= j && k <= (timp/v1); k++){
l2 = (timp - (k*v1))/v2;
if(LB[i-1][j-k] + l2 > LB[i][j]){
LB[i][j] = LB[i-1][j-k] + l2;
A[i][j] = k;
}
}
}
}
for(i=100; i >= l; i--)
if(LB[n][i] >= l){
for(j=1; j<=n; j++)
for(k=0; k<=100 && i<=s; k++){
AS[j][k] = A[j][k];
LBS[j][k] = LB[j][k];
start = i;
}
return 1;
}
return 0;
}
void cautare()
{
int st, dr, mid, sol;
st = 1; dr = 100;
while(st <= dr)
{
mid = (st+dr)/2;
if(dinam(mid)){
sol = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
g<<sol<<"\n";
while(n){
S.push(make_pair(AS[n][start], (sol - V[1][n]*AS[n][start])/V[2][n]));
start = start - A[n--][start];
}
while(S.size()){
g<<S.top().first<<" "<<S.top().second<<"\n";
S.pop();
}
}
int main()
{
citire();
cautare();
return 0;
}