Pagini recente » Cod sursa (job #1833226) | Cod sursa (job #46788) | Cod sursa (job #1325463) | Cod sursa (job #435126) | Cod sursa (job #3191202)
#include <iostream>
#include <fstream>
#include <climits>
#define N_MAX 104
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
/// rezultatele cerute sunt valorile (like preturile obiectelor), si ce mi se da sunt grautatile
int n, l, La[N_MAX], Lb[N_MAX];
int dp[N_MAX][N_MAX];
bool verif (int t){
for (int i=0; i<=n; ++i)
for (int j=0; j<=l; ++j)
dp[i][j] = INT_MIN;
dp[0][0] = 0;
for (int i=1; i<=n; ++i){
for (int j=0; j<=l; ++j){
for (int a=0; a<=t/La[i]; ++a){
int b = (t - La[i] * a) / Lb[i];
dp[i][j] = max (dp[i][j], dp[i-1][max(0, j-a)] + b);
}
}
}
if (dp[n][l] >= l)
return true;
return false;
}
int binarySearch (){
int st = 0, dr = N_MAX, mid;
while (st != dr){
mid = (st+dr)/2;
if (verif(mid) == true)
dr = mid;
else
st = mid + 1;
}
return dr;
}
void getAns (int t){
int index = l, current, anteriorIdx;
pair<int, int> ans[N_MAX];
for (int i=n; i>0; --i){
current = INT_MIN;
for (int a=0; a<=t/La[i]; ++a){
int b = (t - La[i] * a) / Lb[i];
if (current < dp[i-1][max(0, index-a)] + b){
current = dp[i-1][max(0, index-a)] + b;
anteriorIdx = max(0, index - a);
}
}
ans[i].second = dp[i][index] - dp[i-1][anteriorIdx];
ans[i].first = (t - Lb[i] * ans[i].second) / La[i];
index = anteriorIdx;
}
out << t << '\n';
for (int i=1; i<=n; ++i)
out << ans[i].first << ' ' << ans[i].second << '\n';
}
int main (){
in >> n >> l;
for (int i=1; i<=n; ++i)
in >> La[i] >> Lb[i];
int Lans = binarySearch();
getAns(Lans);
return 0;
}