Cod sursa(job #1197601)

Utilizator RaulTofanTofan Raul RaulTofan Data 12 iunie 2014 21:13:23
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
 
int N, L, T;
std::vector<std::pair<<int, int>> v, vs;
char m[101][101][101];
 
void read_input() {
  scanf("%d%d", &N, &L);
  for(int i = 0; i < N; ++i) {
    int A, B;
    scanf("%d%d", &A, &B);
    v.push_back(std::make_pair(A, B));
  }
}
 
void init_mem() {
  memset(m, (char) -1, 101 * 101 * 101);
}
 
template<bool PRINT = false>
bool f(int a, int b, int p) {
  if(p < 0) return a <= 0 && b <= 0;
  if(a < 0) a = 0;
  if(b < 0) b = 0;
  if(m[a][b][p] < 0) {
    int p_maxA = T / v[p].first;
    for(int i = 0; i <= p_maxA; ++i) {
      int lit_A = i;
      int lit_B = (T - lit_A * v[p].first) / v[p].second;
      if(f<PRINT>(a - lit_A, b - lit_B, p - 1)) {
        if(PRINT) printf("%d %d\n", lit_A, lit_B);
        m[a][b][p] = true;
        return true;
      }
    }
    m[a][b][p] = false;
    return false;
  }
  return m[a][b][p];
}
 
void search(int li, int ls) {
  init_mem();
  if(li > ls) {
    T = li;
    return;
  }
  T = (li + ls) / 2;
  if(f(L, L, N - 1)) {
    search(li, T - 1);
  } else {
    search(T + 1, ls);
  }
}
 
bool fcmp(const std::pair<int, int>& a, const std::pair<int, int>& b) {
  return a < b;
}
 
int main(int argc, char *argv[]) {
  freopen("lapte.in", "r", stdin);
  freopen("lapte.out", "w", stdout);
 
  read_input();
  vs = v;
  std::sort(v.begin(), v.end(), fcmp);
 
  search(1, 100);
 
  printf("%d\n", T);
 
  v = vs;
  init_mem();
  f<true>(L, L, N - 1);
 
  return 0;
}