Cod sursa(job #1253258)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 31 octombrie 2014 23:28:27
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int NMAX=100;
const int INFINITE=(1<<30);

struct PAIR
{
    int x,y;
};

int n, l, t;
int a[NMAX+3], b[NMAX+3];
int d[NMAX+3][NMAX+3], X[NMAX+3][NMAX+3];
vector <PAIR> sol;

void Din(int timp)
{
    memset(d, 0, sizeof(d));
    memset(X, 0, sizeof(X));
    for(int i=1;i<=l;++i)
		d[0][i]=-INFINITE;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=l;j++)
        {
			X[i][j]=0;
            d[i][j]=d[i-1][j]+timp/b[i];
            for(int K=0;K<=timp/a[i] && K<=j;K++)
                if(d[i][j]<d[i-1][j-K]+(timp-K*a[i])/b[i])
                {
                    d[i][j]=d[i-1][j-K]+(timp-K*a[i])/b[i];
                    X[i][j]=K;
                }
        }
}

int bs()
{
    int st=1, dr=l*(a[1]+b[1]);
    int last=dr;
    while(st<=dr)
	{
        int mid=(st+dr)/2;
        Din(mid);
        if(d[n][l]>=l)
        {
            last=mid;
            dr=mid-1;
        }
        else st=mid+1;
    }
    return last;
}


int main()
{
	freopen("lapte.in", "r", stdin);
	freopen("lapte.out", "w", stdout);
    scanf("%d%d", &n, &l);
    for(int i=1;i<=n;i++)
        scanf("%d%d", &a[i], &b[i]);
    t=bs();Din(t);
    printf("%d\n", t);
    int s=l;
    for(int i=n;i>0;i--)
	{
        PAIR aux;
        aux.x=X[i][s];
        aux.y=(t-X[i][s]*a[i])/b[i];
        sol.push_back(aux);
        s-=X[i][s];
    }
    for(int i=sol.size()-1;i>=0;i--)
		printf("%d %d\n", sol[i].x, sol[i].y);
    return 0;
}