Cod sursa(job #1109143)

Utilizator andreiiiiPopa Andrei andreiiii Data 16 februarie 2014 19:20:19
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <cstring>
#define PII pair<int, int>
#define x first
#define y second

using namespace std;

const int N=105;

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

int n, l;
PII a[N], b[N];
int dp[N][N], nxt[N][N];

bool verif(int t)
{
    int i, j, k;
    memset(dp, -1, sizeof(dp));
    memset(nxt, 0, sizeof(nxt));
    dp[0][0]=0;
    for(i=1;i<=n;i++)
    {
        for(j=0;j<=l;j++)
        {
            if(dp[i-1][j]==-1) continue;
            for(k=0;k<=t/a[i].x&&j+k<=l;k++)
            {
                if(dp[i][j+k]<dp[i-1][j]+(t-a[i].x*k)/a[i].y)
                {
                    dp[i][j+k]=dp[i-1][j]+(t-a[i].x*k)/a[i].y;
                    nxt[i][j+k]=k;
                }
            }
        }
    }
    if(dp[n][l]>=l) return true;
    return false;
}


int main()
{
    int i, st, dr, mij, sol=0;
    fin>>n>>l;
    for(i=1;i<=n;i++) fin>>a[i].x>>a[i].y;
    for(st=1, dr=100;st<=dr;)
    {
        mij=(st+dr)/2;
        if(verif(mij))
        {
            dr=mij-1;
            sol=mij;
        }
        else st=mij+1;
    }
    verif(sol);
    for(i=n;i;i--)
    {
        b[i].x=nxt[i][l];
        b[i].y=(sol-b[i].x*a[i].x)/a[i].y;
    }
    fout<<sol<<"\n";
    for(i=1;i<=n;i++) fout<<b[i].x<<" "<<b[i].y<<"\n";
    fin.close();
    fout.close();
}