Pagini recente » Cod sursa (job #582458) | Cod sursa (job #522830) | Cod sursa (job #319589) | Cod sursa (job #1445724) | Cod sursa (job #3284319)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int nmax = 100;
const int INF = 1e9;
const int lmax = 100;
int n,l;
int d[nmax + 5][lmax*2 + 5];
int a[nmax + 5];
int b[nmax + 5];
int t[nmax + 5][lmax*2 + 5];
void reset(int val = 0)
{
for(int i=0; i<=n; i++)
for(int j=0; j<=l; j++)
d[i][j]=val;
}
bool good(int tmax)
{
reset(-INF);
d[0][0]=0;
for(int i=1; i<=n; i++)
for(int xa=0; xa<=l; ++xa)
{
int nd = (l-xa)*a[i];
for(int adda = 0; adda*a[i]<=min(tmax,nd); adda++)
{
int use = adda;
int rmn = (tmax-adda*a[i])/b[i];
int newa = min(l,xa+use);
d[i][newa] = max(d[i][newa],d[i-1][xa] + rmn);
}
}
return d[n][l] >= l;
}
void get_sol(int tmax)
{
reset(-INF);
d[0][0]=0;
for(int i=1; i<=n; i++)
for(int xa=0; xa<=l; ++xa)
{
int nd = (l-xa)*a[i];
for(int adda = 0; adda*a[i]<=min(tmax,nd); adda++)
{
int use = adda;
int rmn = (tmax-adda*a[i])/b[i];
int newa = min(l,xa+use);
if(d[i-1][xa] + rmn > d[i][newa]){
d[i][newa] = d[i-1][xa] + rmn;
t[i][newa] = xa;
}
}
}
}
int bs()
{
int st = 1;
int dr = 100;
int bst = 100;
while(st<=dr)
{
int mid = (st+dr)/2;
if(good(mid))
bst = mid,dr=mid-1;
else
st=mid+1;
}
return bst;
}
void afis(int i,int xa)
{
if(i>0)
{
int anta = t[i][xa];
afis(i-1,anta);
fout<<(xa-anta)<<' '<<(d[i][xa] - d[i-1][anta])<<'\n';
}
}
int main()
{
fin>>n>>l;
for(int i=1; i<=n; i++) fin>>a[i]>>b[i];
int mn_time = bs();
fout<<mn_time<<'\n';
get_sol(mn_time);
afis(n,l);
}