Cod sursa(job #1668414)

Utilizator lflorin29Florin Laiu lflorin29 Data 29 martie 2016 19:41:48
Problema Lapte Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define mp make_pair
using namespace std;

int N, L, A[109], B[109];
bool dp[109][109][109],p[109][109][109];
pair<int, int>fol[109][109][109];
vector < pair<int, int>>ans;
/*/
dp(i,j,k) = am primele i nr
daca pot bea
j din A si k din B
dp(i,j,k)=dp(i-1,j-x,k-y)
/*/

void Read()
{
  freopen("lapte.in", "r", stdin);
  scanf("%d%d", &N, &L);
  for(int i = 0; i < N; ++i)
    scanf("%d %d", A + i, B + i);
}

void Upd(int k, int i, int j)
{
  if(i-1>=0)p[k][i-1][j]|=p[k][i][j];
  if(j-1>=0)p[k][i][j-1]|=p[k][i][j];
  if(j - 1 >= 0 && i-1>=0)p[k][i-1][j-1]|=p[k][i][j];
}
bool ok(int mij)
{
  memset(p,0,sizeof p);
  for(int i=0;i<=L;++i)for(int j=0;j<=L;++j)dp[0][i][j]=0;
  for(int i = 0; i * A[0] <= mij && i <= L; ++i)
    for(int j = 0; i * A[0] + j * B[0] <= mij && j <= L; ++j)
       fol[0][i][j] = mp(i, j),p[0][i][j]=1;
    for(int i=0;i<=L;++i)
    for(int j=0;j<=L;++j)Upd(0,i,j);
  if(p[0][L][L])return 1;
  for(int i = 1; i < N; ++i) {
     for(int a = 0; a <= L; ++a)
        for(int b = 0; b <= L; ++b) {
           dp[i][a][b] = 0;
           for(int x = 0; x <= a && A[i] * x <= mij; ++x) {
             int t = (mij - A[i] * x) / B[i];
             if(t>b)t=b;
             if(p[i-1][a - x][b - t]) p[i][a][b] = 1, fol[i][a][b] = make_pair(x, t);
           }

        }

        if(p[i][L][L]) return 1;
        for(int j=0;j<=L;++j)
          for(int k=0;k<=L;++k)Upd(i, j,k);
  }

    return 0;

}


void restore(int pas,int x, int y, int timp)
{
  if(pas==0){ans.pb(fol[pas][x][y]); return;}
  restore(pas-1,x - fol[pas][x][y].first, y - fol[pas][x][y].second, timp);
  ans.pb(fol[pas][x][y]);
}
void Solve()
{
  int st = 0, dr = 100, res = 0;
  while(st<=dr)
  {
    int m = (st+dr)>>1;
    if(ok(m))
    {
      res = m;
      dr = m - 1;
      ans.clear();
      restore(N - 1, L, L, m);
    }
    else st= m+1;
  }
  freopen("lapte.out", "w", stdout);
  printf("%d\n", res);
  for(auto itr : ans)
    printf("%d %d\n", itr.first, itr.second);
}

int main()
{
  Read();
  Solve();
}