Cod sursa(job #2872429)

Utilizator euyoTukanul euyo Data 16 martie 2022 22:53:21
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

ifstream fin( "lapte.in" );
ofstream fout( "lapte.out" );

const int MAX = 105; 

int va[MAX], vb[MAX];
int dp[MAX][MAX];
int from[MAX][MAX];
int n, lp;

bool chk( int t ) {
  for ( int i = 0; i <= lp; ++i ) {
	dp[0][i] = -1e9;
  }
  dp[0][0] = 0;
  for ( int i = 1; i <= n; ++i ) {
	for ( int cA = 0; cA <= lp; ++cA ) {
	  dp[i][cA] = -1e9;
	  from[i][cA] = 0;
	  for ( int _cA = 0; _cA <= cA; ++_cA ) {
		int cB = (t - _cA * va[i]) / vb[i];
		if ( cB <= 0 ) continue;
		if ( dp[i][cA] < dp[i-1][cA - _cA] + cB ) {
          from[i][cA] = cA - _cA;
		  dp[i][cA] = max(dp[i][cA], dp[i-1][cA - _cA] + cB);
	    }
	  }
	}
  }
  return dp[n][lp] >= lp;
}

int main() {

  fin >> n >> lp;
  for ( int i = 1; i <= n; ++i ) {
	fin >> va[i] >> vb[i];
  }
  int l = 0, r = 1e5;
  while ( r - l > 1 ) {
	int mid = (l + r) / 2;
    if ( chk(mid) ) {
	  r = mid;
	} else {
      l = mid;
	}
  }
  fout << l << "\n";
  chk(l);
  vector<pair<int, int>> sol;
  int y = lp;
  for ( int i = n; i >= 1; --i ) {
	sol.push_back({y, dp[i][y]});
    y = from[i][y];
  }
  fout << sol.back().first << " " << sol.back().second << "\n";
  for ( int i = sol.size() - 2; i >= 0; --i ) {
	fout << sol[i].first - sol[i+1].first << " " << sol[i].second - sol[i+1].second << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}