Pagini recente » Cod sursa (job #2038574) | Cod sursa (job #2489319) | Cod sursa (job #537960) | Cod sursa (job #2099989) | Cod sursa (job #2236067)
// setam o limita de timp, astfel ajunge sa stim doar o cantitate de un tip, cealalta va fi max posibil - cantitatea
// DP[i][j] = max litri B stiind ca primii i au baut j litri A
//BASE CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
#pragma once
#include<iostream>
#include <cmath>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define maxN 101
class Participant {
public:
int tA, tB;
public:
Participant() {};
Participant(int a, int b) {
tA = a;
tB = b;
}
};
Participant participanti[maxN];
int DP[maxN][maxN], parentPointers[maxN][maxN], N, L, inf = 1 << 29, sumA = 0, sumB = 0;
int dp(int timp) {
DP[0][0] = 0; // base
for (int i = 1; i <= L; i++)
DP[0][i] = -inf; // 0 nu pot bea nimic
for (int i = 1; i <= N; i++)
for (int j = 0; j <= L; j++)
DP[i][j] = -inf; //init
for (int i = 1; i <= N; ++i) {
for (int j = 0; j <= L; ++j) {
for (int k = 0; k <= j; ++k) {
// i bea k litri de a, se calculeaza toate posibilitatile, apoi se ia cea mai buna, exact ca la rucsac
if (k * participanti[i].tA > timp) {
break;
}
int maxb = (timp - k * participanti[i].tA) / participanti[i].tB + DP[i - 1][j - k];
if (DP[i][j] < maxb) {
DP[i][j] = maxb;
parentPointers[i][j] = k;
}
}
}
}
if(DP[N][L]>=L)
return 1;
return 0;
}
void afis(int timp) {
vector<pair<int, int>> v;
int count = N, left = L;
while (count) {
pair<int, int> p = make_pair(parentPointers[count][left], (timp - participanti[count].tA*parentPointers[count][left]) / participanti[count].tB);
v.push_back(p);
//fout << parentPointers[count][left] << " " << (timp - participanti[count].tA*parentPointers[count][left]) / participanti[count].tB << "\n";
count--;
left = left - parentPointers[count + 1][left];
}
for(int i = v.size()-1; i>=0; i--)
fout<<v[i].first<<" "<<v[i].second<<"\n";
}
int timp_min() {
int mic = 1, mare = 20000, mid, sol;
while (mic<=mare) {
mid = (mic + mare) / 2;
if (dp(mid)) {
mare = mid - 1;
sol = mid;
}
else {
mic = mid + 1;
}
}
return sol;
}
int main() {
int lA, lB, timpMin;
fin >> N >> L;
for (int i = 1; i <= N; i++) {
fin >> lA >> lB;
Participant p = Participant(lA, lB);
participanti[i] = p;
}
timpMin = timp_min();
fout << timpMin << "\n";
afis(timpMin);
return 0;
}