Pagini recente » Monitorul de evaluare | Cod sursa (job #2314961) | Cod sursa (job #2333859) | Monitorul de evaluare | Cod sursa (job #2928666)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l,a[105],b[105],dp[105][105],dpr[105][105],lamax[105];
bool testt(int tmin) {
for(int i=1;i<=n;i++) {
lamax[i]=min(lamax[i-1]+tmin/a[i],l);
for(int lapteA=0;lapteA<=lamax[i];lapteA++) {
dp[i][lapteA]=0;
for(int la = max(0,lapteA-lamax[i-1]); la <= min(lapteA,tmin/a[i]);la++)
{
int lb=(tmin-la*a[i])/b[i];
int v2 = dp[i-1][lapteA-la]+lb;
dp[i][lapteA] = max(dp[i][lapteA],v2);
}
}
}
if(dp[n][l] >= l) {
return 1;
}
return 0;
}
int caut() {
int st=1,dr=100,mij,r=-1;
while(st<=dr) {
mij = (st+dr)/2;
bool ok = testt(mij);
if(ok) {
dr=mij-1;
r=mij;
for(int i=1;i<=n;i++) {
for(int j=0;j<=l;j++) {
dpr[i][j]=dp[i][j];
}
}
}
else st=mij+1;
}
return r;
}
int main() {
fin>>n>>l;
for(int i=1;i<=n;i++) {
fin>>a[i]>>b[i];
}
int rasp = caut();
fout<<rasp<<'\n';
vector<pair<int,int>> ansv(n+1);
int i=n,lapteA=l;
while(i>=1) {
for(int la = min(lapteA,rasp/a[i]); la >= 0 ;la--) {
if(la*a[i]+(dpr[i][lapteA]-dpr[i-1][lapteA-la])*b[i]<=rasp) {
ansv[i]=make_pair(la,dpr[i][lapteA]-dpr[i-1][lapteA-la]);
i--;
lapteA-=la;
break;
}
}
}
for(int i=1;i<=n;i++){
fout<<ansv[i].first<<' '<<ansv[i].second<<'\n';
}
return 0;
}