Cod sursa(job #2236067)

Utilizator DRLDRLRaul Ronald Galea DRLDRL Data 28 august 2018 01:27:38
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
// 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;
}