Pagini recente » Cod sursa (job #2333057) | Cod sursa (job #2728244) | Cod sursa (job #1028966) | Cod sursa (job #1282922) | Cod sursa (job #3143846)
#include <fstream>
using namespace std;
ifstream cin("lapte.in");
ofstream cout("lapte.out");
int timeA[101];
int timeB[101];
int persoane, litri;
const int inf = 10000000;
int BinarySearch(int left, int right);
bool TestTime(int time, int type);
int BinarySearch(int left, int right){
int result = -1;
while (left <= right){
int mid = left + (right - left) / 2;
if (TestTime(mid, 0)){
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
bool TestTime(int time, int type){
int dp[101][101];
for (int i = 0; i <= persoane; i++){
for (int j = 0; j <= litri; j++)
dp[i][j] = -inf;
}
dp[0][0] = 0;
int previous[101][101];
int milk_drank_each[101][2];
for (int i = 1; i <= persoane; i++){
for (int j = 0; j <= litri; j++){
for (int lapteA = 0; lapteA <= j; lapteA++){
if (lapteA * timeA[i] > time)
break;
int lapteB = (time - lapteA * timeA[i]) / timeB[i];
int temporary_dp = dp[i - 1][j - lapteA] + lapteB;
if (temporary_dp > dp[i][j]) {
dp[i][j] = temporary_dp;
previous[i][j] = j - lapteA;
}
}
}
}
if (type == 1){
int best_j = litri;
for (int i = persoane; i >= 1; i--){
int previous_a_drank = best_j - previous[i][best_j];
int lapteB = (time - previous_a_drank * timeA[i]) / timeB[i];
milk_drank_each[i][0] = previous_a_drank;
milk_drank_each[i][1] = lapteB;
best_j = previous[i][best_j];
}
for (int i = 1; i <= persoane; i++)
cout << milk_drank_each[i][0] << " " << milk_drank_each[i][1] << '\n';
}
if (dp[persoane][litri] >= litri)
return true;
return false;
}
int main(){
cin >> persoane >> litri;
for (int i = 1; i <= persoane; i++){
cin >> timeA[i] >> timeB[i];
}
int timp = BinarySearch(1, 100);
cout << timp << '\n';
TestTime(timp, 1);
}